Ruby on rails 3 有很多,通过联想

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

警告:总轨道新(TRN)。这应该是一个非常基本的问题,所以我希望有人能抽出几分钟的时间来帮助阐明

假设我有以下模型:用户、组和成员 用户可以有许多组(比如朋友、家人等) 一个组可以有许多成员,即其他用户

我将如何构造这个

最初我试过这样做:

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组。但实际上,你所说的问题实际上与验证有关。您应该验证您创建的数据的唯一性。我们