根据模型方法过滤ActiveRecord对象?

时间:2014-12-10 15:23:35

标签: ruby-on-rails activerecord where

有没有办法在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上找到合适的关键字。如果在其他地方得到解答,请发布链接。

1 个答案:

答案 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