ruby on rails has_many:通过关联,其中有两列具有相同的模型

时间:2011-06-01 03:20:59

标签: ruby-on-rails model associations has-many-through

我有以下型号:

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

在Post模型中,我有以下一行:

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?

提前致谢!

1 个答案:

答案 0 :(得分: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