如何将条件与Activerecord范围,Rails 4连接起来

时间:2014-08-21 13:42:16

标签: sql ruby-on-rails activerecord ruby-on-rails-4

我正在尝试使用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)}

感谢您的帮助。

**编辑**

此处的评论是从https://github.com/comfy/comfortable-mexican-sofa/blob/b16bb14bec7bffee61949d72a5f2c9eca3c95bf8/lib/comfortable_mexican_sofa/extensions/is_categorized.rb

取得的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
}

2 个答案:

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

另一个更好吗?