Rails:为啥“has_many ...,:通过=> ...”关联导致“NameError:未初始化的常量...”

Posted

技术标签:

【中文标题】Rails:为啥“has_many ...,:通过=> ...”关联导致“NameError:未初始化的常量...”【英文标题】:Rails: Why "has_many ..., :through => ..." association results in "NameError: uninitialized constant ..."Rails:为什么“has_many ...,:通过=> ...”关联导致“NameError:未初始化的常量...” 【发布时间】:2011-10-25 18:48:40 【问题描述】:

为了表示一个组可以有多个用户,一个用户可以属于多个组,我设置了如下关联:

class Group < ActiveRecord::Base
  has_many :users_groups
  has_many :users, :through => :users_groups
end

class User < ActiveRecord::Base
  has_many :users_groups
  has_many :groups, :through => :users_groups
end

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

但是,当我输入时:

Group.find(1).users

我明白了:

NameError: uninitialized constant Group::UsersGroup

我做错了什么?

【问题讨论】:

【参考方案1】:

class UsersGroups 应该是 class UsersGroup。 ActiveRecord 模型是单数的 - 表格是复数的。

【讨论】:

谢谢!拥有一个名为UsersGroup 的模型对我来说看起来很奇怪/错误。我不希望其中一个是复数而另一个是单数。也许我应该将模型重命名为 UserGroupPair 之类的名称,这样表名就会是 user_group_pairs。你怎么看? 当你有一个连接模型时,标准的做法是想出一个描述关联的词。例如,GroupMembership 什么的。只是检查一下,你确定你需要一个连接模型吗?如果连接不需要逻辑,您可以只使用一个表。 你的意思是模型名GroupMembership和表名group_membership,即都是单数吗?我不确定我是否理解您关于摆脱联接表的第二点。你能详细说明一下吗? 如果您不喜欢不一致,请调用连接模型 UserGroup - 这对于 Rails 项目来说是正常的。您还必须将表重命名为 user_groups。 @Misha 您可以摆脱模型但保留表格。但是,如果您需要模型,请将其命名为 GroupMembership 和表格 group_memberships【参考方案2】:

ActiveRecord 尝试将名称单数化,但您的类实际上命名为 UserGroups。将其重命名为UserGroup。模型是单一的。

【讨论】:

【参考方案3】:

我认为将类 UserGroups 的名称更改为 UserGroup

【讨论】:

【参考方案4】:

另外请注意,模型的文件名也必须是单数形式。 在这种情况下,app/models/user_group.rb

【讨论】:

并非总是如此。在这种特殊情况下,没关系。

以上是关于Rails:为啥“has_many ...,:通过=> ...”关联导致“NameError:未初始化的常量...”的主要内容,如果未能解决你的问题,请参考以下文章

Rails:has_many 通过关联 - 我做对了吗?

Has_many:通过 Rails 4 实例变量不起作用

Rails has_many:通过嵌套形式

Rails 4找不到关联has_many,通过:关系错误

Rails:has_many 通过多态关联——这行得通吗?

Rails 关联 has_many 通过禁止/归档解决方案?