Как пройти много-много ассоциаций в activerecord - PullRequest
3 голосов
/ 21 марта 2012

Я создаю среду авторизации, которая в конечном итоге будет использовать cancan на уровне кода.Я создаю модель и ассоциации, и у меня все почти идеально, но я наткнулся на загадку.

У меня есть Пользователь, Роли и Права с множеством таблиц соединения (user_roles и role_rights), и у меня все настроено такчто вы можете сделать User.roles и User.roles.first.rights, но я хотел бы иметь возможность сделать User.rights

class User < ActiveRecord::Base
  has_many :user_roles
  has_many :roles, :through => :user_roles
end

class UserRole < ActiveRecord::Base
  belongs_to :user
  belongs_to :role
end

class Role < ActiveRecord::Base
  has_many :user_roles
  has_many :users, :through => :users_roles
  has_many :role_rights
  has_many :rights, :through => :role_rights
end

class RoleRight < ActiveRecord::Base
  belongs_to :role
  belongs_to :right
end

class Right < ActiveRecord::Base
  has_many :role_rights
  has_many :roles, :through => :role_rights
end

Следующие работы:

User.roles

такделает это:

User.roles.first.rights

, но я хочу сделать следующее:

User.rights

, но когда я пытаюсь, я получаю следующее сообщение об ошибке: NoMethodError: неопределенный метод `rights '

Я предполагаю, что мне нужно что-то добавить в модель User, чтобы сделать ее поперечной к модели Right, но я не могу выяснить ассоциации.

Я использую Rails 2.3.4 и Ruby 1.80,7

1 Ответ

1 голос
/ 21 марта 2012

Попробуйте что-то вроде этого:

class User < ActiveRecord::Base
   def self.rights
     Right.joins(:roles => :user).all("users.id = ?", self.id)
   end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...