Рельсы укрепляют драгоценный камень / вопрос ассоциации

Я использую Rolify Gem с устройством для AdminUser

мой Roles Таблица

 class RolifyCreateRoles < ActiveRecord::Migration
  def change
    create_table(:roles) do |t|
      t.string :name
      t.references :resource, :polymorphic => true

      t.timestamps
    end

    create_table(:admin_users_roles, :id => false) do |t|
      t.references :admin_user
      t.references :role
    end

    add_index(:roles, :name)
    add_index(:roles, [ :name, :resource_type, :resource_id ])
    add_index(:admin_users_roles, [ :admin_user_id, :role_id ])
  end
end

модель "Роль"

 class Role < ActiveRecord::Base
  has_and_belongs_to_many :admin_users, :join_table => :admin_users_roles

  belongs_to :resource,
             :polymorphic => true

  validates :resource_type,
            :inclusion => { :in => Rolify.resource_types },
            :allow_nil => true

  scopify
end

моя проблема, когда я хочу, чтобы пользователи принадлежали к роли, это дает пустой массив вместо моего объекта adminuser

u = AdminUser.first
u.add_role(:admin)

u.roles => #<Role id: 1, name: "admin", admin_user_id: 1, resource_id: nil, resource_type: nil, created_at: "2016-06-16 15:03:33", updated_at: "2016-06-17 09:04:30">

и когда я делаю

Role.first=> #<Role id: 1, name: "admin", admin_user_id: 1, resource_id: nil, resource_type: nil, created_at: "2016-06-16 15:03:33", updated_at: "2016-06-17 09:29:32">
Role.first.admin_users => [] 

2 ответа

Чтобы проверить, имеет ли пользователь глобальную роль:

user = User.find(1)
user.add_role :admin # sets a global role
user.has_role? :admin
=> true

Или проверить на уровне экземпляра в вашем случае

u = AdminUser.first
u.add_role(:admin)

> Role.first=> #<Role id: 1, name: "admin", admin_user_id: 1,
> resource_id: nil, resource_type: nil, created_at: "2016-06-16
> 15:03:33", updated_at: "2016-06-17 09:29:32">

Вместо этого => Role.first.admin_users => [] Попробуйте

u = AdminUser.first
u.roles

Rolify имеет довольно четкую документацию Rolify

О, я исправил это, изменив отношение в моем admin_user модель

от has_many в has_and_belongs_to_many :roles

Другие вопросы по тегам