2011-06-01 115 views
3

我有以下型号两列:Ruby on Rails的的has_many:通过协会,与同型号

class UserShareTag < ActiveRecord::Base 
    attr_protected :sharee_id, :post_id, :sharer_id 

    belongs_to :sharer, :class_name => "User" 
    belongs_to :post 
    belongs_to :sharee, :class_name => "User" 

    validates :sharer_id, :presence => true 
    validates :sharee_id, :presence => true 
    validates :post_id, :presence => true 
end 

在后的模式,我有以下行:

has_many :user_share_tags, :dependent => :destroy 
has_many :user_sharers, :through => :user_share_tags, :uniq => true, :class_name => "User" 
has_many :user_sharees, :through => :user_share_tags, :uniq => true, :class_name => "User" 

怎么办我表示:user_sharers应该对应于:sharer_id?和:user_sharees应该对应于:sharee_id?由于它们都是相同的用户模型,我不确定要做什么。

有点相关的问题 - 在用户模式,我有:

has_many :user_share_tags, :dependent => :destroy 
has_many :user_shared_posts, :through => :user_share_tags, :uniq => true, :class_name => "Post" 
has_many :recommended_posts, :through => :user_share_tags, :uniq => true, :class_name => "Post" 

如何纳入了额外的逻辑:user_shared_posts应包含的职位,其中:sharer_id是USER_ID?和:recommended_posts应该包含:sharee_id是user_id的帖子?

在此先感谢!

回答

3

你只需要一个:source参数添加到您的has_many协会(你不需要:class_name选项):

has_many :user_sharers, :through => :user_share_tags, :source => :sharer, :uniq => true, :class_name => "User" 
has_many :user_sharers, :through => :user_share_tags, :source => :sharee, :uniq => true, :class_name => "User" 

然后在你的User模型,需要一个额外的has_many协会:

has_many :user_share_tags_as_sharee, :class_name => "UserShareTag", :foreign_key => :sharee_id, :dependent => :destroy 
has_many :user_share_tags_as_sharer, :class_name => "UserShareTag", :foreign_key => :sharer_id, :dependent => :destroy 
has_many :user_shared_posts, :source => :post, :through => :user_share_tags_as_sharer, :uniq => true 
has_many :recommended_posts, :source => :post, :through => :user_share_tags_as_sharee, :uniq => true 
+0

source参数做了什么? – mfq 2012-11-20 13:39:26