【问题标题】: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

我做错了什么?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 associations has-many-through


    【解决方案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

        【讨论】:

        • 并非总是如此。在这种特殊情况下,没关系。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-03
        • 1970-01-01
        • 2014-12-14
        • 1970-01-01
        • 2016-07-15
        相关资源
        最近更新 更多