Rails Rich Associations - 未定义的方法错误

时间:2013-08-05 14:52:37

标签: ruby-on-rails model-associations

我正在使用三种基本模型:

class User < ActiveRecord::Base
  has_many :assignments
end

class Assignment < ActiveRecord::Base
  belongs_to :group
  belongs_to :user  
end

class Group < ActiveRecord::Base
  has_many :assignments
end

使用这个模式,我假设“Assignment”模型是连接表的一种,它保存用户属于哪些组的信息。所以,我想要做的是,使用User对象,找出它们属于哪些组。

在Rail控制台中,我正在执行以下操作:

me = User.find(1)

返回用户对象,应该如此。然后,我试图看看这个用户属于哪个“组”,我认为它将通过“Assignment”模型。但是,我显然做错了什么:

me.groups

返回:

NoMethodError: undefined method `groups' for #<User:0x007fd5d6320c68>

我如何找出“我”对象所属的“群组”?

非常感谢!

4 个答案:

答案 0 :(得分:6)

您必须在每个模型中声明用户 - 组关系:

class User < ActiveRecord::Base
  has_many :assignments
  has_many :groups, through: :assignments
end

class Group < ActiveRecord::Base
  has_many :assignments
  has_many :users, through: :assignments
end

另外,我建议您在分配模型上设置一些验证,以确保分配始终引用群组和用户

class Assignment < ActiveRecord::Base
  belongs_to :group
  belongs_to :user  
  validates :user_id, presence: true
  validates :group_id, presence: true
end

答案 1 :(得分:2)

class User < ActiveRecord::Base
  has_many :assignments
  has_many :groups, through: :assignments
end

class Assignment < ActiveRecord::Base
  belongs_to :group
  belongs_to :user  
end

class Group < ActiveRecord::Base
  has_many :assignments
  has_many :users, through: :assignments
end

请参阅association basics

答案 2 :(得分:1)

me的{​​{1}}类型不是User。你想做的事:

Assignment

这将为您提供属于该用户第一次分配的所有组。为了得到你可以做的所有小组,正如MrYoshiji先生在下面评论过的那样:

me.assignments.first.groups

答案 3 :(得分:0)

您没有在群组中定义has_many。试试

me.assignments.first.group 

应该有用。