Первый проход для очистки это будет что-то вроде
class Post < ActiveRecord::Base
belongs_to :account
scope :sane_defaults, where(:published => true).order('created_at DESC').limit(5)
scope :with_account, lambda {|account|
if account.try(:tags)
tagged_with(account.tags)
end
}
end
, а затем вызов Post.with_account(account).sane_defaults
Очень неприятно, что tagged_with не очень хорошо работает с другими областями.Большинство областей возвращают активный объект отношения, с которым вы можете связать цепочку, но, очевидно, когда передано значение nil или даже пустой массив tagged_with, возвращает хеш.Это невежливо и должно быть исправлено.
Как правило, в Ruby не проверяется nil, потому что nil - это ложное значение, а проверка на существование объекта короче и оценивает true.
Также вы можете назначить результат выражения if.так что было бы более логичным сказать:
results = if account && account.tags
tagged_with(account.tags).where(:published => true).order('created_at DESC').limit(5)
else
where(:published => true).order('created_at DESC').limit(5)
end
Существует довольно много споров о методе try, но если у вас нет мнения о том, является ли это хорошей или плохой практикой, используйте ее, пока не разработаетеодин.Это позволит вам сократить
if account && account.tags
до
if account.try(:tags)
Было бы интересно увидеть весь ваш метод контроллера.