6

我有一個模型設置如下所示:Default_scope基於連接表

class User 
    has_many :items 
    has_many :words, :through => :items 
end 

class Item 
    belongs_to :user 
    belongs_to :word 

    default_scope where(:active => true) 
end 

class Words 
    has_many :items 
end 

我遇到的問題是,default_scope沒有被應用到下述關聯:

user.words 

代替此SQL的:

SELECT `words`.* FROM `words` INNER JOIN `items` ON `words`.id = `items`.word_id WHERE ((`items`.user_id = 1)) AND ((`items.active = 1)) 

我得到這個SQL日誌中:

SELECT `words`.* FROM `words` INNER JOIN `items` ON `words`.id = `items`.word_id WHERE ((`items`.user_id = 1)) 

我想這是因爲默認範圍適用於常規模型及其子關聯,但不適用於連接表。

什麼是正確的Rails的方式來獲取連接表範圍工作之間的關聯,而無需指定它?有一個存在嗎?

回答

10

在#ruby-on-rails的dfr幫助下找出答案。

在User類,設置的has_many關係是:

has_many :words, :through => :items, :conditions => { "items.active" => true } 

這是因爲,雖然有用戶HABTM和Word之間加入協會,項目模型是不實際時user.words是裝調用。因此,您必須將範圍應用於用戶模型中的關聯。

希望能幫到別人。

2

謝謝你的幫助。這張票(雖然無效)也有人在討論它:https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/3610-has_many-through-associations-may-not-respect-default_scope-conditions#ticket-3610-17

我個人覺得這張票不是無效的。默認範圍是默認範圍。

+0

我同意。似乎應該在調用關聯時加載連接模型。我認爲這不是爲了優化。不過,我認爲連接模型是放置該範圍的正確位置,而不是讓它掛在用戶模型中的has_many方法。 – joeellis 2011-03-29 21:07:47