假設我們有一個攝影網站。任何作者都可以訂閱以接收來自其他作者的更新。顯然,如果一個作者是訂閱筆者B中並不意味着B被預訂A.所以,我們建立模型如何在Rails中創建「雙面」多對多關係?
class Author < ActiveRecord::Base
has_many :subscriptions
has_many :subscribed_by_author, :through => :subscriptions, :source => :subscribed_to
end
class Subscription < ActiveRecord::Base
belongs_to :author
belongs_to :subscribed_to, :class_name => "Author", :foreign_key => "subscribed_to"
end
這樣我們就可以使用
- some_author.subscribed_by_author - 列表的作者被some_author訂閱。
- 因爲我們可以知道的兩端(誰訂閱了誰)
但問題是,如何讓人們訂閱了一些筆者僅使用軌道列表中的任何訂閱(不使用普通的SQL),即GET答案是:「誰訂閱了some_author?」
問題:在Rails中是否有能力讓雙方的關係能夠工作,即不僅編寫some_author.subscribed_BY_author
而且編寫了some_author_subscribed_TO_author
?如果有一個,那麼它是什麼?
P.S. subscribed_BY_author:明顯的解決方案是
- 更改數據庫的設計,增加了一個名爲列的「方向」
- 創建2每個訂閱創建
加入筆者的模型
的has_many時間記錄,:through =>:subscriptions,:source =>:subscribed_to,:conditions =>「direction ='by'」
has_many:subscribed_TO_author,:through =>:subscriptions,:source =>:subscribed_to,:condit '=「方向='到'」
但我不知道是否有一個解決方案,而不改變數據庫設計。
不幸的是它沒有。但它給了我正確的方向和以下代碼工作 #作者模型 has_many:subscriptions_to,:class_name =>「訂閱」,:foreign_key =>「subscribed_to」 has_many:subscribed_to_author,:through =>:subscriptions_to,:source =>:作者 所以我接受這個答案,但你必須編輯它是正確的第一個:) 謝謝! – 2010-02-14 17:34:44
修理我的喉嚨總是我的榮幸:) – klew 2010-02-14 17:40:45