ruby on rails - generate - Rails ActiveRecord: Finden Sie alle Benutzer mit Ausnahme des aktuellen Benutzers



rails save (8)

Ich denke, das sollte sehr einfach sein, aber mein Gehirn ist kurz darauf. Wenn ich ein Objekt habe, das den aktuellen Benutzer darstellt und für alle Benutzer mit Ausnahme des aktuellen Benutzers abfragen möchte, wie kann ich dies tun, unter Berücksichtigung, dass der aktuelle Benutzer manchmal nil ?

Das mache ich gerade jetzt:

def index
  @users = User.all
  @users.delete current_user
end

Was ich nicht mag, ist, dass ich eine Nachbearbeitung des Abfrageergebnisses mache. Abgesehen davon, dass ich mich ein wenig falsch fühle, glaube ich nicht, dass dies gut funktionieren wird, wenn ich die Abfrage will_paginate , damit sie mit will_paginate . Irgendwelche Vorschläge, wie Sie dies mit einer Abfrage tun können? Vielen Dank.

https://src-bin.com


Answer #1

Ein Array wäre hilfreicher

arrayID [0] = 1

arrayID [1] = 3

User.where.not (ID: arrayID)


Answer #2

Ein Hinweis auf GhandaLs Antwort - zumindest in Rails 3, es ist es wert, geändert zu werden

scope :without_user, lambda{|user| user ? {:conditions => ["users.id != ?", user.id]} : {} }

(Die primäre Änderung ist hier von 'id! = ...' zu 'users.id! = ...'; auch scope anstelle von named_scope for Rails 3)

Die ursprüngliche Version funktioniert einwandfrei, wenn Sie einfach die Tabelle "Benutzer" definieren. Beim Anwenden des Bereichs auf eine Verknüpfung (z. B. team.members.without_user (current_user) ....) musste diese Änderung klären, welche Tabelle wir für den ID-Vergleich verwenden. Ich sah einen SQL-Fehler (mit SQLite) ohne es.

Entschuldigung für die separate Antwort ... Ich habe noch nicht den Ruf, GhandaLs Antwort direkt zu kommentieren.


Answer #3

Hier ist eine kürzere Version:

User.all :conditions => (current_user ? ["id != ?", current_user.id] : [])

Answer #4

In Rails 4 ist Folgendes möglich:

User.where.not(id: id)

Sie können es in einen schönen Rahmen einpacken.

scope :all_except, ->(user) { where.not(id: user) }
@users = User.all_except(current_user)

Oder verwenden Sie eine Klassenmethode, wenn Sie bevorzugen:

def self.all_except(user)
  where.not(id: user)
end

Beide Methoden geben ein AR-Beziehungsobjekt zurück. Dies bedeutet, dass Sie Methodenaufrufe verketten können:

@users = User.all_except(current_user).paginate

Sie können beliebig viele Benutzer ausschließen, da where() auch ein Array akzeptiert.

@users = User.all_except([1,2,3])

Beispielsweise:

@users = User.all_except(User.unverified)

Und auch durch andere Verbände:

class Post < ActiveRecord::Base
  has_many :comments
  has_many :commenters, -> { uniq }, through: :comments
end

@commenters = @post.commenters.all_except(@post.author)

Siehe where.not() in den where() where.not() .


Answer #5

Sie können auch named_scope erstellen, zB in Ihrem Modell:

named_scope :without_user, lambda{|user| user ? {:conditions => ["id != ?", user.id]} : {} }

und im Controller:

def index
  @users = User.without_user(current_user).paginate
end

Dieser Bereich gibt alle Benutzer zurück, wenn sie mit nil und allen Benutzern aufgerufen werden, außer in anderen Fällen in param. Der Vorteil dieser Lösung besteht darin, dass Sie diesen Aufruf mit anderen benannten Bereichen oder der paginate-Methode "will_paginate" ketten können.


Answer #6

Sie löschen den aktuellen Benutzer aus dem @ users-Array. Dies wird nicht funktionieren, da es keine Löschmethode für Arrays gibt. Was Sie wahrscheinlich tun möchten, ist dies

def index
  @users = User.all
  @users - [current_user]
end

Dadurch wird eine Kopie des @ users-Arrays zurückgegeben, aber das Objekt current_user wurde entfernt (es war an erster Stelle im Array enthalten).

Hinweis: Dies funktioniert möglicherweise nicht, wenn die Array-Subtraktion auf genauen Übereinstimmungen von Objekten und nicht auf dem Inhalt basiert. Aber es hat mit Strings funktioniert, als ich es versuchte. Denken Sie daran, current_user in [] einzufügen, um es in ein Array zu zwingen.


Answer #7

User.where (: id.ne => aktuelle_benutzer.id)


Answer #8
@users = (current_user.blank? ? User.all : User.find(:all, :conditions => ["id != ?", current_user.id]))




activerecord