我正试图在波纹管关系中提取给定用户的所有帖子。不确定我是否正确,所以我会更好地解释。用户在某些组中拥有所有权和成员资格。用户可以是该组的成员或所有者,但不能同时是两者。每个帖子都有用户和组的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; ”。它是以下之一:用户,:组或:发布?
答案 0 :(得分:1)
首先:你得到了你看到的错误,因为你已经在Membership
和Ownership
表中定义了关联:
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_many
和Ownership
模型是madness的路径。
我真的建议你只有一个Membership
模型,它有一个布尔属性,声明一个组的所有者。这也意味着,如果你愿意,你可以以一种非常简单的方式为一个小组拥有新的所有者:只需翻转布尔值即可。无需在另一个表中创建另一个记录。
一个Membership
模型来统治它们。