2011-11-07 56 views
1

我有2種型號:LinkUser如:ActiveRecord的,雙belongs_to的

class Link < ActiveRecord::Base 
    belongs_to :src_user 
    belongs_to :dst_user 
end 

class User < ActiveRecord::Base 
    has_many :links 
end 

一個模式可能看起來像:

+----------+  +------+ 
| Link  |  | User | 
+----------+  |------+ 
| src_user |---->|  | 
| dst_user |---->|  | 
+----------+  +------+ 

我的問題是:我怎麼可以編輯User模型做爲了做到這一點

@user.links # => [list of links] 

(...如果可能,應該查詢@ user.src_users + @ users.dst_users,使用唯一性)。

我們可以在ActiveRecord中只使用SQL嗎? 非常感謝。

(注:我on Rails的3.1.1)

+0

是不是默認行爲? 'link'關聯在User中,並且將查詢具有匹配的user_id值的所有鏈接的'Links'表。 –

回答

3

您必須在用戶模型中指定多個關係,以便知道它將連接到哪個特定關聯。

class Link < ActiveRecord::Base 
    belongs_to :src_user, class_name: 'User' 
    belongs_to :dst_user, class_name: 'User' 
end 

class User < ActiveRecord::Base 
    has_many :src_links, class_name: 'Link', inverse_of: :src_user 
    has_many :dst_links, class_name: 'Link', inverse_of: :dst_user 
end 

必須指定class_name選項,因爲關聯名稱不是簡單的:鏈接。您可能還需要在Link模型中指定:inverse_of選項,但我無法確定。不過,如果你這樣做,它不會受到傷害。

爲了做你的@ user.links電話,你就必須做這樣的事情:

class User < ActiveRecord::Base 
    def links 
    Link.where(['src_user = ? OR dst_user = ?', self.id, self.id]) 
    end 
end 

...因爲ActiveRecord的不提供一種方式來合併在同一個模型兩會成一。

0

這聽起來非常相似的孩子/母親/父親的問題,其中有一個解決方案。也就是說,一個類型爲多個對象的同一類型的對象(不一定與孩子類型相同,但它所屬的對象本身是同一類型)的問題。

這個解決方案非常陳舊,並且可能不會在Rails3中使用最新的樣式方案,但它應該可以正常工作,或者只需很少的修改。 http://railsforum.com/viewtopic.php?id=1248

相關問題