有没有办法在where
中使用过滤条件,而不是DB列。如果我有Movie
模型,请使用以下方法:
def blockbuster?
imdb_rating > 8
end
有没有办法像Movie.where(:blockbuster? => true)
那样做。我知道在这个特定的例子中,可以只使用imdb_rating
属性(Movie.where('imdb_rating > ?', 8)
),但有些情况下,当一个方法执行更复杂的逻辑时。目前,如果我想这样做,我必须调用Movie.all.select(&:blockbuster?)
,但我想在数据库级别执行此操作。谢谢。
P.S。我确信类似的问题会被多次询问,但我似乎无法在这里或在Google上找到合适的关键字。如果在其他地方得到解答,请发布链接。
答案 0 :(得分:0)
你试过把它变成一个范围吗?有关范围in the Rails documentation的一些信息。
基本上,使用您的方法,您可以执行以下操作:
class Movie < ActiveRecord::Base
scope :blockbuster, -> { where('imdb_rating > ?', 8) }
end
Movie.blockbuster # returns all relevant objects as an ActiveRecord relation
类方法也可用作范围:
class Movie < ActiveRecord::Base
def self.blockbuster?
where('imdb_rating ?', 8)
end
end
Movie.blockbuster? # also returns all relevant objects as an ActiveRecord relation