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:未初始化的常量...”的主要内容,如果未能解决你的问题,请参考以下文章