根据模型方法筛选活动记录对象



有没有办法在where中使用过滤条件,这不是数据库列。如果我有一个使用以下方法的Movie模型:

def blockbuster?
  imdb_rating > 8
end

有没有办法做像Movie.where(:blockbuster? => true)这样的事情.我知道在这个特定的例子中,可以只使用 imdb_rating 属性 ( Movie.where('imdb_rating > ?', 8) ),但在某些情况下,当一个方法执行更复杂的逻辑时。目前,如果我想这样做,我必须调用Movie.all.select(&:blockbuster?),但我想在数据库级别执行此操作。谢谢。

附言我确信类似的问题被问了很多次,但我似乎想不出正确的关键字来在这里或在谷歌上找到它们。如果在其他地方回答了这个问题,请发布一个链接。

你试过把它做成一个范围吗?Rails 文档中有一些关于作用域的信息。

基本上,使用您的方法,您将执行以下操作:

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

最新更新