Несколько аргументов в области

Это, вероятно, просто для большинства из вас, однако я действительно не написал много областей действия с несколькими аргументами, с одним аргументом все в порядке, просто не уверен здесь. Я пытаюсь создать область, в которой говорится: «Дайте мне все книги, которые проверил текущий пользователь».

Так что я придумал это в своей книжной модели

scope :checked_out_book, lambda{|user| { :conditions => { :user_id => current_user.id, :checked_out => true } }

Раньше я не использовал лямбда, поэтому не уверен, правильно ли я его использую, в любом случае я получаю сообщение об ошибке

syntax error, unexpected keyword_end, expecting '}'

Может кто-то указать мне верное направление

РЕДАКТИРОВАТЬ

Изменили область действия на

scope :checked_out_book, lambda {|user| where(:user_id => user.id, :checked_out => true) }

но теперь я получаю

неправильное количество аргументов (0 вместо 1) Спасибо


person Richlewis    schedule 10.01.2013    source источник
comment
о да, я пропустил { перед пользователем, поэтому не закрыл его, глупая ошибка   -  person Richlewis    schedule 10.01.2013
comment
пометить как ответ, если хотите, приму, если вы не против объяснить немного о лямбда и почему мы передаем пользователя в || благодарю вас   -  person Richlewis    schedule 10.01.2013
comment
И это не имеет никакого отношения к вашему вопросу, но ваша область видимости ложна, current_user ничего вам здесь не даст, вы должны использовать данный аргумент user   -  person pjam    schedule 10.01.2013


Ответы (2)


Я бы сделал это так:

scope :checked_out_book, lambda {|user| where(:user_id => user.id, :checked_out => true) }
person Erez Rabih    schedule 10.01.2013
comment
это может быть глупый вопрос, но именно поэтому я пропускаю |user|, я не уверен в использовании лямбда в данный момент, спасибо за ваш ответ, хотя - person Richlewis; 10.01.2013
comment
решил это, отсутствует ) в конце, теперь получает неправильное количество аргументов (0 вместо 1) - person Richlewis; 10.01.2013
comment
Вы должны передать пользователя в область действия: Book.checked_out_book(@some_user) - person Erez Rabih; 10.01.2013
comment
ах да, так что в моем случае current_user, поскольку он будет меняться в зависимости от того, кто вошел в систему - person Richlewis; 10.01.2013

В модели Book область видимости должна быть такой:

scope :checked_out_book, lambda {|user| where(:user_id => user.id, :checked_out => true) }

или для Руби 1.9

scope :checked_out_book, ->(user) { where(user_id: user.id, checked_out: true) }

И вы бы назвали это так:

Book.checked_out_book(current_user)

Теперь, когда User has_many Books, я бы, наверное, выбрал что-то подобное и не заморачивался с областями. Если вам нужен метод, подобный подходу, вы всегда можете создать метод, который возвращает объект Relation.

current_user.books.where(checked_out: true)

or

def checked_out_books
  books.where(checked_out: true)
end
# current_user.checked_out_books
person Jiří Pospíšil    schedule 10.01.2013
comment
спасибо, это хорошо, есть ли причина, по которой здесь лучше не использовать области видимости? просто интересно с воспитательной точки зрения - person Richlewis; 10.01.2013
comment
Думаю, это просто вопрос личных предпочтений. В Rails 2 они позволяли вам связывать запросы, но поскольку почти все в Rails 3 возвращает объект Relation, вы также можете связать его, и области видимости становятся просто странным способом написания методов класса... - person Jiří Pospíšil; 10.01.2013