我有一个名为Panda的ActiveRecord模型,其中包含一个名为variant的列,它可以包含'bam-abc','bam-123','boo-abc'和'boo-123'等值,我想创建一个范围,选择变体以'boo'开头的所有记录。
在控制台中,我可以使用以下内容选择那些记录(以'boo'开头):
Panda.select{|p| p.variant.starts_with? 'boo'}
有没有办法把它变成熊猫类的范围?我需要能够在我的RSpec测试的范围内执行'to_sql'。
答案 0 :(得分:1)
您希望使用发送LIKE的scope进入数据库,例如:
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
如果您认为您将与其他可能使pandas
名称不明确的表进行JOIN,则只需要在列名称上使用variant
前缀。如果您永远不会进行JOIN,或者您的数据库中只有一个variant
列,那么您可以使用以下其中一个:
scope :boos, -> { where('variants like ?', 'boo%') }
def self.boos
where('variants like ?', 'boo%')
end
答案 1 :(得分:0)
将以下行添加到Panda类
scope :boo, -> { where('variant LIKE ?', 'boo%') }
然后,您可以使用Panda.boo
获取包含以boo开头的变体的所有记录。 Panda.boo.to_sql
将为您提供sql