【问题标题】:Filter ActiveRecord objects based on model method?根据模型方法过滤 ActiveRecord 对象?
【发布时间】:2014-12-10 15:23:34
【问题描述】:

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

def blockbuster?
  imdb_rating > 8
end

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

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

【问题讨论】:

    标签: ruby-on-rails activerecord where


    【解决方案1】:

    你试过把它做成一个范围吗?有一些关于范围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
    

    【讨论】:

    • 不,重点是我不使用方法的内容。想象一个由外部 gem 提供的方法。重点是 - 我不直接接触对象属性/表格列。
    • 布尔方法应该用于返回布尔值的方法;)
    猜你喜欢
    • 2018-11-14
    • 2023-03-29
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多