Направляющие ActiveRecord: найдите всех пользователей кроме текущего пользователя

Я чувствую, что это должно быть очень просто, но мой мозг закорачивает на нем. Если я имею объект, представляющий текущего пользователя, и хочу запросить для всех пользователей кроме текущего пользователя, как я могу сделать это, приняв во внимание, что текущий пользователь может иногда быть nil?

Это - то, что я делаю прямо сейчас:

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

То, что я не люблю, - то, что я делаю последующую обработку на результате запроса. Помимо чувства немного неправильного, я не думаю, что это будет работать приятно, если я преобразую запрос, чтобы быть выполненным с will_paginate. Какие-либо предложения для того, как сделать это с запросом?Спасибо.

58
задан SingleShot 20 April 2010 в 05:23
поделиться

4 ответа

Вы также можете создать named_scope, например в вашей модели:

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

и в контроллере:

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

Эта область будет возвращать всех пользователей при вызове с nil и всех пользователей, кроме указанных в param в другом случае. Преимущество этого решения в том, что вы можете связать этот вызов с другими именованными областями действия или методом paginate will_paginate.

16
ответ дан 24 November 2019 в 18:38
поделиться

Вот более короткая версия:

User.all :conditions => (current_user ? ["id != ?", current_user.id] : [])
7
ответ дан 24 November 2019 в 18:38
поделиться

Вы удаляете current_user из массива @users. Это не сработает, поскольку для массивов нет метода удаления. Что вы, вероятно, захотите сделать, так это это

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

. Это вернет копию массива @users, но с удаленным объектом current_user (он изначально содержался в массиве.

Примечание: это может не сработать если вычитание массива основано на точном совпадении объектов, а не на содержимом. Но когда я пробовал, он работал со строками. Не забудьте заключить current_user в [], чтобы преобразовать его в массив.

-5
ответ дан 24 November 2019 в 18:38
поделиться
@users = (current_user.blank? ? User.all : User.find(:all, :conditions => ["id != ?", current_user.id]))
32
ответ дан 24 November 2019 в 18:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: