【问题标题】:Creating a scope on an ActiveRecord Model在 ActiveRecord 模型上创建范围
【发布时间】:2014-09-25 01:27:22
【问题描述】:
我有一个名为 Panda 的 ActiveRecord 模型,其中有一个名为 variant 的列,它可以包含诸如“bam-abc”、“bam-123”、“boo-abc”和“boo-123”之类的值。我想创建一个范围选择变体以“boo”开头的所有记录。
在控制台中,我可以使用以下命令选择那些记录(以“boo”开头):
Panda.select{|p| p.variant.starts_with? 'boo'}
有没有办法把它变成 Panda 类的作用域?我需要能够在我的 RSpec 测试范围内执行“to_sql”。
【问题讨论】:
标签:
ruby
activerecord
rails-activerecord
【解决方案1】:
您希望使用scope 将 LIKE 发送到数据库中,例如:
scope :boos, -> { where('pandas.variants like ?', 'boo%') }
或者等效地,使用类方法:
def self.boos
where('pandas.variants like ?', 'boo%')
end
然后你可以这样说:
Panda.boos.where(...)
Panda.where(...).boos
Panda.boos.where(...).to_sql
Panda.where(...).boos.to_sql
如果您认为要与其他可能使variant 名称不明确的表进行联接,则只需在列名称上使用pandas 前缀。如果您永远不会进行 JOIN,或者您的数据库中只有一个 variant 列,那么您可以使用以下之一:
scope :boos, -> { where('variants like ?', 'boo%') }
def self.boos
where('variants like ?', 'boo%')
end
【解决方案2】:
将下面的行添加到 Panda 类中
scope :boo, -> { where('variant LIKE ?', 'boo%') }
然后您可以使用Panda.boo 来获取所有以 boo 开头的变体记录。 Panda.boo.to_sql会给你sql