Ruby on rails 3 在RubyonRails3中连接3个表

Ruby on rails 3 在RubyonRails3中连接3个表,ruby-on-rails-3,relationships,Ruby On Rails 3,Relationships,我试图在下面的关系中提取给定用户的所有帖子。我不确定我是否理解正确,所以我最好解释一下。用户在某些组中拥有所有权和成员资格。用户可以是组的成员或所有者,但不能同时是两个。每个帖子都有一个用户和组的id。我认为问题是由以下关系引起的。我怎样才能避开它?还有一件事。我还必须找到用户组中其他用户发布的所有帖子。换句话说,我必须通过小组 /-- Owner ---\ User -- -- Group -- Post | \-- Member --/

我试图在下面的关系中提取给定用户的所有帖子。我不确定我是否理解正确,所以我最好解释一下。用户在某些组中拥有所有权和成员资格。用户可以是组的成员或所有者,但不能同时是两个。每个帖子都有一个用户和组的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
错误如下所示:

找不到模型所有权中的源关联:用户。尝试“has_many:groups,:through=>:ownerships,:source=>”。它是:用户、:组还是:帖子之一


首先:您看到的错误是因为您在
成员资格
所有权
表中定义了如下关联:

belongs_to :users
当它们只属于一个用户时,即单数
用户

belongs_to :user
但即使这样,你也会遇到问题

我认为拥有
会员资格
模式和
所有权
模式会让你下一步陷入困境。我不明白拥有
所有权
模型的目的是什么,除了表示一个组的所有权,这可以通过
成员身份
表记录中名为
所有者
的字段来实现。这是工程上的问题

Rails代码的问题在于,您定义通过一个关联有许多帖子,然后告诉它通过另一个关联有许多帖子。实际上,您正在这样做:

 def posts
   # find posts for the groups that I own
 end

 def posts
   # find posts for the groups I belong to
 end
这里有两个名称相同的方法,这一点没错。这正是通过定义两个具有许多同名关联的
来实现的

因此,希望您现在可以了解为什么拥有
所有权
成员资格
模型是实现这一目标的途径

我真的建议您只使用一个
成员身份
模型,该模型具有一个布尔属性,声明组的所有者。这也意味着,如果您愿意,您可以以一种非常简单的方式为一个组创建新的所有者:只需翻转布尔值即可。无需在另一个表中创建另一条记录


一个
成员资格
模型来管理所有成员。

首先:您看到的错误是因为您在
成员资格
所有权
表中定义了以下关联:

belongs_to :users
当它们只属于一个用户时,即单数
用户

belongs_to :user
但即使这样,你也会遇到问题

我认为拥有
会员资格
模式和
所有权
模式会让你下一步陷入困境。我不明白拥有
所有权
模型的目的是什么,除了表示一个组的所有权,这可以通过
成员身份
表记录中名为
所有者
的字段来实现。这是工程上的问题

Rails代码的问题在于,您定义通过一个关联有许多帖子,然后告诉它通过另一个关联有许多帖子。实际上,您正在这样做:

 def posts
   # find posts for the groups that I own
 end

 def posts
   # find posts for the groups I belong to
 end
这里有两个名称相同的方法,这一点没错。这正是通过定义两个具有许多同名关联的
来实现的

因此,希望您现在可以了解为什么拥有
所有权
成员资格
模型是实现这一目标的途径

我真的建议您只使用一个
成员身份
模型,该模型具有一个布尔属性,声明组的所有者。这也意味着,如果您愿意,您可以以一种非常简单的方式为一个组创建新的所有者:只需翻转布尔值即可。无需在另一个表中创建另一条记录


一个
会员资格
模型来管理他们所有人。

我还没有理解这个问题。什么不符合您的预期?@mkro抱歉,我错过了我刚才在结尾添加的一部分。我还必须通过用户的成员身份和所有权从属于该用户的组中收集所有帖子。@mkro I将更具体:这将给我一个错误-_groups=user.groups无法找到源关联:模型所有权中的用户。尝试“has_many:groups,:through=>:ownerships,:source=>”。是:用户、:组还是:帖子?我还不明白这个问题。什么不符合您的预期?@mkro抱歉,我错过了我刚才在结尾添加的一部分。我还必须通过用户的成员身份和所有权从属于该用户的组中收集所有帖子。@mkro I将更具体:这将给我一个错误-_groups=user.groups无法找到源关联:模型所有权中的用户。尝试“has_many:groups,:through=>:ownerships,:source=>”。是:用户、:组还是:帖子?嗨,瑞安!我喜欢疯狂链接:)。非常感谢您的解释和查找错误原因。我会考虑你的建议。虽然一般来说,分离的最初目的是在将来将所有者和成员的属性保留在单独的表中。嗨,Ryan!我喜欢疯狂链接:)。非常感谢您的解释和查找错误原因。我会考虑你的建议。虽然一般来说,分离的最初目的是在将来将所有者和成员的属性保留在单独的表中。