Я чувствую, что это должно быть очень просто, но мой мозг закорачивает на нем. Если я имею объект, представляющий текущего пользователя, и хочу запросить для всех пользователей кроме текущего пользователя, как я могу сделать это, приняв во внимание, что текущий пользователь может иногда быть nil
?
Это - то, что я делаю прямо сейчас:
def index
@users = User.all
@users.delete current_user
end
То, что я не люблю, - то, что я делаю последующую обработку на результате запроса. Помимо чувства немного неправильного, я не думаю, что это будет работать приятно, если я преобразую запрос, чтобы быть выполненным с will_paginate
. Какие-либо предложения для того, как сделать это с запросом?Спасибо.
Вы также можете создать 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.
Вот более короткая версия:
User.all :conditions => (current_user ? ["id != ?", current_user.id] : [])
Вы удаляете current_user из массива @users. Это не сработает, поскольку для массивов нет метода удаления. Что вы, вероятно, захотите сделать, так это это
def index
@users = User.all
@users - [current_user]
end
. Это вернет копию массива @users, но с удаленным объектом current_user (он изначально содержался в массиве.
Примечание: это может не сработать если вычитание массива основано на точном совпадении объектов, а не на содержимом. Но когда я пробовал, он работал со строками. Не забудьте заключить current_user в [], чтобы преобразовать его в массив.
@users = (current_user.blank? ? User.all : User.find(:all, :conditions => ["id != ?", current_user.id]))