Необязательные или условные ассоциации моделей в Rails - PullRequest
5 голосов
/ 12 октября 2011

У меня есть модель пользователя. Пользователи могут иметь 1 из 3 ролей: роль1, роль2, роль3. Это представлено столбцом «роль» в пользовательской модели. Каждая роль имеет уникальный профиль. role1_profile, role2_profile, role3_profile. Каждый * _profile - это модель.

Как мне представить эту необязательную ассоциацию в Rails?

Я пробовал это двумя разными способами:

class User < ActiveRecord::Base
    #FIRST WAY
    if current_user.role == 'role1' then has_one :role1_profile end 
    #SECOND WAY
    has_one :role1_profile, :conditions => ['user.role = ?', 'role1']
end

Но это не работает. Как правильно это сделать?

Ответы [ 2 ]

4 голосов
/ 12 октября 2011

Вместо этого вы можете рассмотреть полиморфную ассоциацию и просто иметь соответствующие профили ролей.

Насколько я понимаю, :conditions были условиями, ассоциированными с моделью должен встретиться (но я могу ошибаться).

В любом случае, я думаю, вы делаете это более трудным, чем оно есть на самом деле, и запутываете то, что вам действительно нужно, делая эти отношения условными.

4 голосов
/ 12 октября 2011

Ассоциации не предназначены быть условными. Наверное, проще всего так и держать.

Как насчет полиморфной ассоциации между User и различными ролями?

class User
  belongs_to :role_profile, :polymorphic => true
end

class RoleXProfile
  has_many :users, :as => :role_profile
end

Конечно, вам нужно добавить поля role_profile_id и role_profile_type в таблицу пользователей.

Независимо от того, что вы делаете, вам нужно будет проверять роль пользователя или файл role_profile, где бы вы его не использовали.

...