Rails 4具有命名功能

时间:2016-08-02 16:50:43

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

我遇到了Rails 4连接表的问题。我有一个非常简单的设置,它在我的应用程序的其他地方工作,使用非常规命名表用于用户,组和用户组成员。我这次尝试使用适当的传统命名进行设置,但它只是不起作用。

涉及的模型包括User,ManagementGroup和ManagementGroupsUser db表:management_groups_user,management_groups,users

应用程序/模型/ user.rb

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

应用程序/模型/ management_group.rb

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

应用程序/模型/ management_groups_user.rb

class ManagementGroupsUser < ActiveRecord::Base

  belongs_to :users
  belongs_to :management_groups

该关联似乎与@ user.management_groups_users有关,但没有别的。我很确定这是命名/多元的问题,但我无法弄清楚。

4 个答案:

答案 0 :(得分:1)

这是加入其余模型的模型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

现在应该工作

答案 1 :(得分:0)

这样做。

应用程序/模型/ user.rb

has_many :user_management_groups    
has_many :management_groups, through: user_management_groups

应用程序/模型/ management_group.rb

has_many :user_management_groups
has_many :users, through: :user_management_groups

应用程序/模型/ management_groups_user.rb

belongs_to :user
belongs_to :management_group

我希望这些协会会帮助你。

答案 2 :(得分:0)

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

应用程序/模型/ 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" 

应用程序/模型/ management_group.rb

has_many :user_management_groups
has_many :users, through: :user_management_groups

应用程序/模型/ management_groups_user.rb

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

这是另一种方式。

答案 3 :(得分:0)

重要的是要认识到Rails用于HABTM并使用了许多约定。 HABTM没有模型,因此需要推断表名,正如其他人指出的那样,表名既是复数形式又是字母顺序。

如果您正在做的事情很多,并且有一个模型,那么习惯上就是要单数第一个单词,复数第二个单词。查看示例

用户拥有并属于许多组。

HABTM :表名应为groups_users

遍历:表名应为user_groups(翻转顺序更直观)

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