почему не has_many: через работу здесь ... есть ли скрытое ограничение? - PullRequest
2 голосов
/ 27 июля 2011

Этот вопрос для Rails 3.0.0.

У меня есть 5 таблиц (надуманный, но разумный пример, только 4 вопроса):

capabilities
    id
    name

capability_roles
    role_id
    capability_id

user_roles
    user_id
    role_id

users
    id
    name

roles
    id
    name

В основном возможности подключаются к role_capabilities подключаются к user_roles подключается к пользователям.

Таблицы * _roles - это просто карты. У них нет первичного ключа. Роли Сам стол практически не имеет отношения к этому вопросу.

Это позволяет редактировать возможности каждой роли независимо от роли, которые могут принимать пользователи.

Было бы неплохо просто выяснить, какие возможности есть у пользователя.

Теперь настройте ассоциации:

users
    has_many :user_roles  # .joins( :user_roles ).to_sql # works

user_roles
    belongs_to :user # .joins( :user ).to_sql # works

    # .joins( :capability_roles ).to_sql # works (no corresponding belongs_to!)
    has_many :capability_roles, :primary_key => role_id, :foreign_key => :role_id

    # .joins( :capabilities ).to_sql # fails
    has_many :capabilities, :through => :capability_roles

capability_roles
    belongs_to :capabilities # .joins( :capabilities ).to_sql # works

    # .joins( :user_roles ).to_sql # works (no corresponding belongs_to!)
    has_many :user_roles, :primary_key => role_id, :foreign_key => :role_id

    # .joins( :users ).to_sql # fails
    has_many :users, :through => :user_roles 

capabilities
    has_many :capability_roles  # .joins( :capability_roles ).to_sql # works

Мой вопрос:

Почему не has_many: через работу здесь?

Похоже, для чего было разработано has_many: through. Я не уверен, если проблема с отсутствующими / не относящимися к этому параметромочным. (1023 *)

Ошибка, которую я вижу: NoMethodError: неопределенный метод `eq 'для nil: NilClass

1 Ответ

2 голосов
/ 27 июля 2011

Используемые таблицы соединений рассчитаны на отношения has_and_belongs_to_many, а не has_many, и, как ожидается, не будут иметь связанных классов.Я бы пошел с чем-то вроде этого:

Role
  has_and_belongs_to_many :capabilities
  has_and_belongs_to_many :users

User
  has_and_belongs_to_many :roles
  has_many :capabilities # use SQL with sub-select through roles to get the capabilities

Capability
  has_and_belongs_to_many :roles
  has_many :users # use SQL with sub-select through roles to get the users
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...