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
我在使用 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