在Ruby on Rails 3中加入3个表

时间:2011-09-12 22:43:03

标签: ruby-on-rails-3 relationships

我正试图在波纹管关系中提取给定用户的所有帖子。不确定我是否正确,所以我会更好地解释。用户在某些组中拥有所有权和成员资格。用户可以是该组的成员或所有者,但不能同时是两者。每个帖子都有用户和组的ID。我认为问题是由于下面提到的关系。我怎么能绕过它呢?还有一件事。我还必须找到其他用户在用户组中发布的所有帖子。换句话说,我必须通过小组。

       /-- Owner ---\
User --              -- Group -- Post
  |    \-- Member --/             |
  |_______________________________|

class User < ActiveRecord::Base
  has_many :posts, :dependent => :destroy
  has_many :ownerships, :foreign_key => "user_id", :dependent => :destroy
  has_many :memberships, :foreign_key => "user_id", :dependent => :destroy

  # Problem with these two? I think so.
  has_many :groups, :through => :memberships, :source => :user
  has_many :groups, :through => :ownerships, :source => :user

class Ownership < ActiveRecord::Base
  belongs_to :users, :class_name => "User"
  belongs_to :groups, :class_name => "Group"
  has_many :posts, :through => :groups, :source => :posts

class Membership < ActiveRecord::Base
  belongs_to :users, :class_name => "User"
  belongs_to :groups, :class_name => "Group"
  has_many :posts, :through => :groups, :source => :posts

class Group < ActiveRecord::Base
  has_many :posts, :dependent => :destroy

class Post < ActiveRecord::Base
  belongs_to :user
  belongs_to :groups

错误来自这条线:

_groups = user.groups

错误如下:

  

找不到源关联:模型所有权中的用户。试试'has_many:groups,:through =&gt; :ownerships,:source =&gt; ”。它是以下之一:用户,:组或:发布?

1 个答案:

答案 0 :(得分:1)

首先:你得到了你看到的错误,因为你已经在MembershipOwnership表中定义了关联:

belongs_to :users

当它们只属于一个用户时,即单数user

belongs_to :user

但即便如此,你也会遇到问题!

我认为拥有Membership模型和Ownership模型会让您下次惹恼我们。除了表示组的所有权之外,我不明白拥有Ownership模型的目的是什么,这可以通过名为memberships的{​​{1}}表的记录中的字段来完成。实例。这是过度工程。

你遇到的Rails代码存在的问题是,你通过一个协会定义了很多帖子,然后你告诉它你通过另一个协会发了很多帖子。实际上,你是这样做的:

owner

这里没有错误,有两个同名的方法。通过定义两个具有相同名称的 def posts # find posts for the groups that I own end def posts # find posts for the groups I belong to end 关联,完全正在做什么。

所以希望你现在可以看到为什么has_manyOwnership模型是madness的路径。

我真的建议你只有一个Membership模型,它有一个布尔属性,声明一个组的所有者。这也意味着,如果你愿意,你可以以一种非常简单的方式为一个小组拥有新的所有者:只需翻转布尔值即可。无需在另一个表中创建另一个记录。

一个Membership模型来统治它们。