我正在尝试使用rails 4为Active Record模型创建一个范围。范围处理我能够单独执行的两个条件:
1)includes(:categories).for_category("proposal")
2)where(:is_published => true)
我需要一个范围来返回满足任一条件的所有记录(不一定都是)。如下所示:
scope :proposal, -> { includes(:categories).for_category("proposal") || where(:is_published => true)}
感谢您的帮助。
**编辑**
取得的for_category范围的定义scope :for_category, lambda { |*categories|
if (categories = [categories].flatten.compact).present?
self.distinct.
joins(:categorizations => :category).
where('comfy_cms_categories.label' => categories)
end
}
答案 0 :(得分:2)
您需要定义一个包含sql“OR”的新范围。我不知道你的“for_category”范围是做什么的,但让我们说它就像是
scope :for_category, ->(category_name) { where("categories.name" => category_name)}
然后你可以创建一个像这样的新范围:注意where
参数是一个值列表而不是一个哈希值(哈希表单只能为=
测试生成用AND
测试加入的{ 1}})
scope :published_or_for_category ->(category_name){ includes(:categories).where("categories.name = ? OR proposals.is_published = ?", category_name, true) }
答案 1 :(得分:0)
根据Max的建议,我得到了以下工作:
scope :published_or_for_category, ->(category_name){
includes(:categories).where(
"comfy_cms_categories.label = ? OR is_published = ?",
category_name, true
)
}
我可能会提到以下似乎也有效:
scope :proposal, -> { includes(:categories).for_category("proposal") | where(:is_published => true) }
另一个更好吗?