2010-06-23 42 views
3

在我的Rails應用程序中,用戶可以訂閱其他用戶。一個應該能夠從用戶實例中獲得用戶的訂閱和訂閱者。Rails雙向自引用has_many:通過 - 控制器設置?

現在,我有一個User模型和一個Subscription模型。 Subscription是加入模式(加入UserUser)中的雙向自我參照has_many :through的關係。

訂閱:

class Subscription < ActiveRecord::Base 
    belongs_to :from_user, :class_name => 'User' 
    belongs_to :to_user, :class_name => 'User' 
end 

用戶:

class User < ActiveRecord::Base 
    ... 
    has_many :subscriptions_as_subscriber, :foreign_key => 'from_user_id', :class_name => 'Subscription', :dependent => :destroy 
    has_many :subscriptions_as_subscription, :foreign_key => 'to_user_id', :class_name => 'Subscription', :dependent => :destroy 
    has_many :subscribers, :through => :subscriptions_as_subscription, :source => :from_user 
    has_many :subscriptions, :through => :subscriptions_as_subscriber, :source => :to_user 
    ... 
end 

第一個問題:我會用不同的設置得到更好的服務?

第二個問題:我如何創建控制器來創建和銷燬訂閱並訪問用戶的訂閱和訂閱者?

現在,我有一個SubscriptionsControllercreatedestroy行動,並在我的UsersControllersubscriptionssubscribers行動。但是,我想知道是否沒有更好的(更RESTful?)方式來執行此操作。通過SubscriptionsController上的index操作訪問用戶的訂閱和訂閱者,也許?

+0

一個has_and_belongs_to_many關係應該會最好是imo。 HABTM追隨者和HABTM追隨者。 – Garrett 2010-06-23 16:53:12

回答

1

我會推薦awesome_nested_set from collective_idea。實施起來是一件輕而易舉的事,應該給你你正在尋找的功能。

下面是關於實施一些細節後,你可以借用:http://www.justinball.com/2009/01/18/heirarchies-trees-jquery-prototype-scriptaculous-and-acts_as_nested_set/

UPDATE:

我會看到這種設置成一棵樹:

Subscriber 
+ subscription 
    + subscription 
    + subscription 
    + subscription 
    + subscription 
+ subscription 
+0

謝謝,傑夫。不幸的是,我認爲這不會對我有幫助。這看起來對構建樹木很有用(比如,對於分層評論),但對於我的場景來說並非如此。也許我錯過了一些東西。 – nickpatrick 2010-06-23 16:19:23