2014-10-19 38 views
0

這兩個領域似乎並不要支持鏈式鏈接範圍藉助加入

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錯了嗎?

回答

1

如果您讓ActiveRecord爲您執行更多的繁重工作,您會得到更有用的結果。特別是,如果你正確設置關聯,你應該能夠編寫,而不是以下:

scope :with_galleries, joins(brand: :galleries)

...這將產生一個適當的可鏈接範圍。

這將取決於兩個協會,一個來自你的網頁模式向品牌:

'belongs_to的:品牌

,一個從品牌到畫廊::

has_many :galleries, as: :galleriable

我從你寫的查詢推斷你的模型設置,所以我可能猜錯了。但是這裏的基本原則是聲明你的關聯並讓ActiveRecord構造查詢(除非你的查詢是非常不尋常的東西,你的查詢不是 - 你只是根據是否有關聯的記錄進行過濾,這是一種常見的操作)。

+0

謝謝!我可以在哪裏閱讀關於連接(品牌::畫廊)的語法? – 2014-10-20 04:22:18

+0

哈!實際上,我上面寫的語法看起來很有趣,因爲我更習慣於相當於舊的哈希火箭風格:'連接(:品牌=>:畫廊)'。你可以在[活動記錄查詢接口指南](http://guides.rubyonrails.org/active_record_querying.html)中閱讀它。搜索「加入嵌套關聯」。 – 2014-10-20 19:53:43

0

您需要使用Arel構造第二個作用域。最簡單的方法是創建想要第二個示波器的完整SQL語句,然後將其粘貼到http://www.scuttle.io/