链接范围与连接

时间:2014-10-19 17:27:06

标签: sql ruby-on-rails ruby-on-rails-4 outer-join

这两个范围似乎不是可链接的

scope :approved, ->{ with_stage(:approved)}

在sql中是

WHERE (pages.stage & 4 <> 0)

scope :with_galleries, ->{ joins("LEFT OUTER JOIN galleries ON galleries.galleriable_type = 'Brand' AND galleries.galleriable_id = page.brand_id").where("galleries.id is NOT NULL") }

此范围应仅提供具有图库的页面(每个页面都有一个品牌,每个品牌可以有许多图库)

如果我链接:with_galleries,似乎pages表上的其他条件都丢失了

我在做joins错了吗?

2 个答案:

答案 0 :(得分:1)

如果让ActiveRecord为您做更多繁重的工作,您将获得更有用的结果。特别是,如果您已正确设置关联,则应该能够编写以下内容:

scope :with_galleries, joins(brand: :galleries)

......这将产生适当的可链接范围。

这取决于两个关联,一个从您的页面模型到品牌:

&#39; belongs_to:brand&#39;

和一个从品牌到画廊::

has_many :galleries, as: :galleriable

我从您撰写的查询中推断出您的模型设置,所以我可能猜错了。但这里的基本原则是声明你的关联并让ActiveRecord构造查询(除非你的查询是非常不寻常的,你的查询不是 - 你只是过滤取决于是否有相关的记录,一个常见的操作)。

答案 1 :(得分:0)

您需要使用Arel构建第二个范围。最简单的方法是制作您希望第二个范围表示的完整SQL语句,然后将其粘贴到http://www.scuttle.io/