Есть ли чистый Rails способ установить атрибуты при создании моделей соединения? - PullRequest
1 голос
/ 16 октября 2010

Я использую Rails 3 и имею богатую связь между Проектами и Пользователями.Модель соединения (UsersProject) имеет дополнительный логический атрибут administrator, который помечает User как администратора Project:

Конечно, я упускаю что-то очевидное здесь, но есть личистый способ установить атрибут administrator в модели соединения (UsersProject) при создании нового проекта?Например:

class Project < ActiveRecord::Base
  has_many :users_projects
  has_many :users, :through => :users_projects
end

class User < ActiveRecord::Base
  has_many :users_projects
  has_many :projects, :through => :users_projects

  # Guessing I use something along these lines, although should I be using scope?
  # has_many :administered_projects,
  #          :through => :users_projects,
  #          :source => :project,
  #          :conditions => ['users_projects.administrator = ?', true]
  #          ...
end

class UsersProject < ActiveRecord::Base
  # Join model has an boolean attribute :administrator
  belongs_to :user
  belongs_to :project
end

# INTENDED USAGE:

@project = @user.administered_projects.new(params[:project])
# => Creates a UsersProject record with `:administrator=true`

@project = @user.projects.new(params[:project])
# => Creates a UsersProject record with `:administrator=false`

Ценю любую помощь, Крис

1 Ответ

1 голос
/ 16 октября 2010

Хотя я не отвечаю на ваш вопрос напрямую, реализация мне кажется немного неуклюжей.

Если бы у вас были пользователи и проекты, ответ был бы прост - вы могли бы просто создать has_and_belongs_to_many взаимосвязь между двумя моделями и создать таблицу соединений. Флаг администратора делает ситуацию немного сложнее, но я не уверен, что объединение модель было бы необходимо.

Лично я бы просто установил две связи между моделями, например:

class Project < ActiveRecord::Base
  has_and_belongs_to_many :users
  has_and_belongs_to_many :administrators, :class_name => 'User', :join_table => 'administrators_projects' # potentially some foreign_key directives here as well
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :projects
  has_and_belongs_to_many :administered_projects, :class_name => 'Project', :join_table => 'administrators_projects' # potentially some foreign_key directives here as well
end

Таким образом, у вас останутся только две модели, но со всеми необходимыми вам функциями (и ваши структуры "INTENDED USAGE" будут работать). Если вы хотите, вы также можете добавить администраторов в отношение projects_users (так, чтобы администраторы были администраторами и пользователи), но это полностью зависело от того, как вы хотите структурировать остальную часть таблицы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...