3 回答

TA貢獻(xiàn)1854條經(jīng)驗(yàn) 獲得超8個(gè)贊
這應(yīng)該做你想要的工作:
Rails 3和4
scope :without_children, includes(:children).where(:children => { :id => nil })
這里的最大區(qū)別是joins
成為a includes
:一個(gè)include加載所有關(guān)系,如果它們存在,則join將僅加載關(guān)聯(lián)的對(duì)象并忽略沒有關(guān)系的對(duì)象。
事實(shí)上,scope :with_children, joins(:children)
應(yīng)該足以讓父母至少回到1個(gè)孩子。試試看!
Rails 5
請(qǐng)參閱下面的@ Anson的回答
正如@MauroDias所指出的,如果它是你父母和孩子之間的自我指涉關(guān)系,那么上面的代碼將不起作用。
通過一些研究,我發(fā)現(xiàn)了如何做到這一點(diǎn):
考慮這個(gè)模型:
class Item < ActiveRecord::Base has_many :children, :class_name => 'Item', :foreign_key => 'parent_id'
如何返回沒有孩子的所有項(xiàng)目(ren):
Item.includes(:children).where(children_items: { id: nil })
我怎么找那張children_items
桌子的?
Item.joins(:children)
生成以下SQL:
SELECT "items".* FROM "items" INNER JOIN "items" "children_items" ON "children_items"."parent_id" = "items"."id"
所以我猜測(cè)Rails在自引用的情況下需要JOIN時(shí)使用表。

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊
有一個(gè)堅(jiān)實(shí)的Rails 4答案,但是對(duì)于那些來到Rails 5的人來說,你有更多的選擇。
使用Rails 5:
從Rails 5開始,您還可以使用left_outer_joins來避免加載關(guān)聯(lián)。它是在拉取請(qǐng)求#12071中引入的。
scope :without_children, left_outer_joins(:children).where(children: { id: nil })
對(duì)于有孩子的父母,MrYoshiji的Rails 4解決方案仍然可以使用:
scope :with_children, joins(:children)

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊
這就是我為Rails 5解決它的方法:
scope :without_comments, -> do left_outer_joins(:comments).where(comments: { id: nil })end
- 3 回答
- 0 關(guān)注
- 552 瀏覽
添加回答
舉報(bào)