Во-первых, лямбда-области с параметрами устарели.Вместо этого используйте метод класса:
class Notification
belongs_to :notifiable, polymorphic: true
def self.relevant(user_id)
# ...
end
end
Я обычно перемещаю функции области видимости в их собственный модуль, но вы можете оставить его там.
Далее find(:all)
устарело, как и :conditions
.Сейчас мы используем запросов ActiveRelation .
К сожалению, API ActiveRecord::Relation
недостаточно надежен, чтобы делать то, что вам нужно, поэтому вместо этого нам придется перейти на ARel.Немного сложно, но вы определенно не хотите делать подстановку строк из соображений безопасности.
class Notification
belongs_to :notifiable, polymorphic: true
def self.relevant(user_id)
n, c = arel_table, Comment.arel_table
predicate = n.join(c).on(n[:notifiable_id].eq(c[:id]))
joins( predicate.join_sql ).
where{ ( notifiable_type != 'Comment' ) |
(( notifiable_type == 'Comment' ) & ( comments.user_id == my{user_id} ))
}
end
end
Я использую комбинацию ARel и Squeel здесь.Squeel настолько хорош, что это должно быть основной особенностью Rails.Я пытался написать предложение where без Squeel, но это было так сложно, что я сдался.
Сложно протестировать что-то подобное без вашего проекта, но, надеюсь, это должно как минимум приблизить вас.