Ruby on rails 3 有很多,通过联想
警告:总轨道新(TRN)。这应该是一个非常基本的问题,所以我希望有人能抽出几分钟的时间来帮助阐明 假设我有以下模型:用户、组和成员 用户可以有许多组(比如朋友、家人等) 一个组可以有许多成员,即其他用户 我将如何构造这个 最初我试过这样做:Ruby on rails 3 有很多,通过联想,ruby-on-rails-3,Ruby On Rails 3,警告:总轨道新(TRN)。这应该是一个非常基本的问题,所以我希望有人能抽出几分钟的时间来帮助阐明 假设我有以下模型:用户、组和成员 用户可以有许多组(比如朋友、家人等) 一个组可以有许多成员,即其他用户 我将如何构造这个 最初我试过这样做: class User < ActiveRecord::Base has_many :groups has_many :groups, :through => :members end class Groups < ActiveRe
class User < ActiveRecord::Base
has_many :groups
has_many :groups, :through => :members
end
class Groups < ActiveRecord::Base
has_many :users, :through => :members
belongs_to :user
end
class Member < ActiveRecord::Base
belongs_to :group
belongs_to :user
end
到
当我尝试执行此操作时,仍然会出现缺少关联的错误
group = Group.new
group.user.new
这将有助于:
class用户:成员
拥有\u多个:组\u作为\u所有者,:class\u name=>“组”
终止
类组:成员
属于:所有者,:类名称=>“用户”,:外键=>:用户id
终止
类成员
它将非常有用:
class用户:成员
拥有\u多个:组\u作为\u所有者,:class\u name=>“组”
终止
类组:成员
属于:所有者,:类名称=>“用户”,:外键=>:用户id
终止
类成员
基本上有多个直通关联:n:m个关联(联接表),这些关联(应)具有比联接记录id的id更多的属性
因此,您有一个表组(带有id)、一个表用户(带有id)和一个表成员(没有id,但有用户id和组id)
基本上,您所做的几乎是正确的,只要想想您如何从用户访问组,或者从用户访问组
用户将首先查找其成员信息,并通过该成员信息访问组信息。。。对于一个群体,反之亦然
所以你首先设置了
has_many :members
然后打电话
has_many :groups, :through => :members
你所需要的只是
class User < ActiveRecord::Base
has_many :members
has_many :groups, :through => :members
end
class Groups < ActiveRecord::Base
has_many :members
has_many :users, :through => :members
end
class Member < ActiveRecord::Base
belongs_to :group
belongs_to :user
end
而不是
user = group.user.new
基本上,多通关联是n:m个关联(联接表),这些关联(联接表)的属性应多于联接记录id的id 因此,您有一个表组(带有id)、一个表用户(带有id)和一个表成员(没有id,但有用户id和组id) 基本上,您所做的几乎是正确的,只要想想您如何从用户访问组,或者从用户访问组 用户将首先查找其成员信息,并通过该成员信息访问组信息。。。对于一个群体,反之亦然 所以你首先设置了
has_many :members
然后打电话
has_many :groups, :through => :members
你所需要的只是
class User < ActiveRecord::Base
has_many :members
has_many :groups, :through => :members
end
class Groups < ActiveRecord::Base
has_many :members
has_many :users, :through => :members
end
class Member < ActiveRecord::Base
belongs_to :group
belongs_to :user
end
而不是
user = group.user.new
尝试以下结构:
class User < ActiveRecord::Base
has_many :members
has_many :groups, :through => :members
end
class Groups < ActiveRecord::Base
has_many :members
has_many :users, :through => :members
end
class Member < ActiveRecord::Base
belongs_to :group
belongs_to :user
end
class用户:成员
终止
类组:成员
终止
类成员
还要看一下has_和\u beliens_to_many
,如果你不需要处理类成员,那么你应该使用has_和\u beliens_to_many
。在这种情况下,不要忘记在数据库中创建联接表尝试以下结构:
class User < ActiveRecord::Base
has_many :members
has_many :groups, :through => :members
end
class Groups < ActiveRecord::Base
has_many :members
has_many :users, :through => :members
end
class Member < ActiveRecord::Base
belongs_to :group
belongs_to :user
end
class用户:成员
终止
类组:成员
终止
类成员
还要看一下
has_和\u beliens_to_many
,如果你不需要处理类成员,那么你应该使用has_和\u beliens_to_many
。在这种情况下,不要忘记在数据库中创建联接表,我又慢了几秒钟:-)又慢了几秒钟:-)为什么调用user.groups
时会在返回的数组中多次显示组?例如,如果一个组中有两个成员,并调用user.groups
,则该组将在数组中显示两次,因为它与两个成员关联,因为这是一种自然行为。它将返回的不是uniq组,而是所有关联的组,正如成员所返回的一样多。您可以随时调用user.groups.uniq
或通过DISTINCT
sql为用户返回uniq组。但实际上,你所说的问题实际上与验证有关。您应该验证您创建的数据的唯一性。好吧,它不会在数据库中创建多个“group#2”,因此所有的group ID在数据库中都是唯一的,不应该是验证。它只是多次返回唯一组,因为它与成员连接。因此,使用user.groups.uniq
返回一个唯一集可能是正确的。感谢您的解释它正在创建具有相同引用的多个成员
,因此它是关于验证成员
伟大答案的!问题就在这里。仍然缺少一个链接,即用户是组的一部分,但用户也是组的所有者。因此,每个组都需要有一个user_id字段,该字段指示哪个用户拥有它。虽然上的指南中有很多贯穿关系,但它们没有告诉您如何处理两个模型之间的多个关系。为什么在调用user.groups
时,会在返回的数组中多次显示组?例如,如果一个组中有两个成员,并调用user.groups
,则该组将在数组中显示两次,因为它与两个成员关联,因为这是一种自然行为。它将返回的不是uniq组,而是所有关联的组,正如成员所返回的一样多。您可以随时调用user.groups.uniq
或通过DISTINCT
sql为用户返回uniq组。但实际上,你所说的问题实际上与验证有关。您应该验证您创建的数据的唯一性。我们