Rails has_and_belongs_to_many收集方法没有显示在对象上

时间:2014-03-21 10:22:17

标签: ruby-on-rails ruby ruby-on-rails-4 has-and-belongs-to-many

我在Rails 4应用中遇到has_and_belongs_to_many问题。设置如下:

  • 用户可以有多个角色
  • 角色可以有多个权限

由于许多用户可以共享相同的角色,并且许多角色可以共享相同的权限,并且我不需要它们之间的特殊连接模型,因此我将has_and_belongs_to_many用于这两种关系。

以下是模型(去除了验证):

class User < ActiveRecord::Base
  has_and_belongs_to_many :roles
end

class Role < ActiveRecord::Base
  has_and_belongs_to_many :permissions
  has_and_belongs_to_many :users
end

class Permission < ActiveRecord::Base
  has_and_belongs_to_many :roles
end

连接表按惯例命名:

create_table "permissions_roles" do |t|
  t.integer "role_id"
  t.integer "permission_id"
end

create_table "roles_users" do |t|
  t.integer "role_id"
  t.integer "user_id"
end

角色&lt; - &gt;权限很有用,但用户&lt; - &gt;角色似乎只有一种方式。我可以将用户附加到角色,但不能将角色附加到用户 - 用户对象上不存在集合方法。从rails控制台:

> r = Role.first # Fetch a role
> r.users        # Empty list of users -- so far so good
> u = User.first # Fetch a user
> u.roles        # NoMethodError: undefined method `roles' for #<User:0x007fe67562f580>

知道会发生什么事吗?

更新

当我从控制台运行User.has_and_belongs_to_many :roles时,正确设置了关联,我可以毫无问题地运行User.first.roles。当应用程序被引导时,似乎没有设置由于某种原因的关联。

2 个答案:

答案 0 :(得分:0)

也许你应该考虑使用has_many,:through

这是一个例子

来自rubyonrails.org:

class Assembly < ActiveRecord::Base
  has_many :manifests
  has_many :parts, through: :manifests
end

class Manifest < ActiveRecord::Base
  belongs_to :assembly
  belongs_to :part
end

class Part < ActiveRecord::Base
  has_many :manifests
  has_many :assemblies, through: :manifests
end

更多资源:

  1. the-has-many-through-association
  2. choosing-between-has-many-through-and-has-and-belongs-to-many

答案 1 :(得分:0)

解决了它,它非常特定于项目。我们所有的模型都需要在多个项目中使用,因此它们都存在于自己的宝石中。事实证明,在另一个位置有一个不同的用户模型取代了宝石中的那个。