Rails 4 has_many 通过命名

Rails 4 has_many through naming

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

涉及的模型有User、ManagementGroup和ManagementGroupsUser db tables: 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 一起工作,但没有别的。我相当确定这是命名/复数的问题,但我无法弄清楚。

这样做。

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

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

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

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"

这是另一种方式。

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

的模型
#app/models/management_groups_user.rb
belongs_to :user
belongs_to :management_group

既然我们要使用上面的模型访问另一个模型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

现在应该可以了

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

如果你正在做 has many through 并且有一个模型,惯例是它想要单数第一个词,复数第二个。查看示例

用户拥有并属于多个组。

HABTM: table 名字应该是 groups_users

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

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