【问题标题】:Rails 4 has_many through namingRails 4 has_many 通过命名
【发布时间】:2016-08-02 16:50:42
【问题描述】:

我在使用 Rails 4 连接表时遇到问题。我有一个非常简单的设置,它在我的应用程序的其他地方工作,使用非常规命名的用户、组和用户组成员表。这次我尝试使用正确的常规命名来设置它,但它不起作用。

涉及的模型是 User、ManagementGroup 和 ManagementGroupsUser 数据库表:management_groups_user、management_groups、用户

app/models/user.rb

Class User < ActiveRecord::Base
...
  has_many :management_groups, through: management_groups_users
  has_many :management_groups_users
....

app/models/management_group.rb

class ManagementGroup < ActiveRecord::Base
  has_many :users, through: :management_groups_users
  has_many :management_groups_users

app/models/management_groups_user.rb

class ManagementGroupsUser < ActiveRecord::Base

  belongs_to :users
  belongs_to :management_groups

该关联似乎与 @user.management_groups_users 一起工作,但没有别的。我相当确定这是命名/复数的问题,但我无法弄清楚。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 associations has-many


    【解决方案1】:

    这是加入剩余模型 user.rb 和 management_group 的模型

    #app/models/management_groups_user.rb
    belongs_to :user
    belongs_to :management_group
    

    既然我们要使用上面的模型来访问另一个模型管理组,那么

    #app/models/user.rb
    has_many :user_management_groups  #This should come first  
    has_many :management_groups, through: user_management_groups
    

    既然我们要使用上面的模型来访问另一个用户模型,那么

    app/models/management_group.rb
    has_many :user_management_groups
    has_many :users, through: :user_management_groups
    

    现在应该可以工作了

    【讨论】:

    • 感谢 Pradeep,在发现 belongs_to 关系是复数而不是单数的错误后,这就是我的代码现在的样子。仅供参考,我测试了 has_many 行的顺序,但似乎没有太大区别。
    • 这是公认的答案,但没有任何投票,其他答案有大量投票,真的很奇怪@stackoverflow
    【解决方案2】:

    这样做。

    app/models/user.rb

    has_many :user_management_groups    
    has_many :management_groups, through: user_management_groups
    

    app/models/management_group.rb

    has_many :user_management_groups
    has_many :users, through: :user_management_groups
    

    app/models/management_groups_user.rb

    belongs_to :user
    belongs_to :management_group
    

    我希望这些协会对你有所帮助。

    【讨论】:

    • 您好,感谢您抽出宝贵时间提供帮助。您对前两个文件的建议不起作用,因为它们与数据库名称/约定不匹配,但您确实突出了我犯的一个错误。我用于“belongs_to”的关联在表格应该是单数时使用了复数形式。改变了这个,一切正常:)
    • 添加第三个表名UserManagementGroup。上面的代码就可以了。
    • 这样 app/models/management_groups_user.rb self.table_name = 'user_management_groups'
    【解决方案3】:

    如果您传递外键和类名,这是另一种方式。

    app/models/user.rb

    has_many :user_management_groups, :foreign_key => "key", :class_name => "ClassName"     
    has_many :management_groups, through: user_management_groups, :foreign_key => "key", :class_name => "ClassName" 
    

    app/models/management_group.rb

    has_many :user_management_groups
    has_many :users, through: :user_management_groups
    

    app/models/management_groups_user.rb

    belongs_to :user, class_name: "ClassName"
    belongs_to :management_group, class_name: "ClassName"
    

    这是另一种方式。

    【讨论】:

      【解决方案4】:

      重要的是要意识到 HABTM 有一个约定 rails 使用并且有很多通过。 HABTM 没有模型,因此它需要推断表名,正如其他人指出的那样,表名既是复数也是字母顺序。

      如果你正在做很多通过并有一个模型,约定是它需要单数第一个单词,复数第二个。查看示例

      用户拥有并属于许多组。

      HABTM:表名应该是 groups_users

      Has Many Through:表名应该是 user_groups(翻转顺序更直观)

      后者的模型是 UserGroup。有很多通过将其指定为through: :user_groups

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-22
        • 1970-01-01
        • 2018-12-03
        • 2016-02-18
        • 1970-01-01
        • 1970-01-01
        • 2015-11-16
        • 2014-12-16
        相关资源
        最近更新 更多