我在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
。当应用程序被引导时,似乎没有设置由于某种原因的关联。
答案 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 :(得分:0)
解决了它,它非常特定于项目。我们所有的模型都需要在多个项目中使用,因此它们都存在于自己的宝石中。事实证明,在另一个位置有一个不同的用户模型取代了宝石中的那个。