Переопределение метода присваивания для has_one - PullRequest
0 голосов
/ 24 сентября 2010

У меня есть ассоциация has_one, которая отражает объекты другой ассоциации.У меня есть Project, который имеет много ProjectUsers, которые связывают Projects и Users.Один из тех ProjectUsers является авторитетным.Проблема в том, что has_one и has_many используют один и тот же внешний ключ для project_users.Вот основная идея моделей.

class Project < ActiveRecord::Base
  has_many :project_users, :class_name => 'ProjectUser', :foreign_key => 'project_id'
  has_one :authoritative_user, :class_name => 'ProjectUser', :foreign_key => 'project_id', :conditions => {:authoritative => true}
end

class ProjectUser < ActiveRecord::Base
  belongs_to :project
  belongs_to :user
  # has a boolean column 'authoritative'
end

Что я хотел бы сделать, это вызвать что-то вроде.

project = Project.new
project_user = ProjectUser.new
project.project_users << project_user
project.authoritative_user = project_user
other_project_user = ProjectUser.new
project.project_users << other_project_user
project.authoriative_user = other_project_user

Где authoritative_user = будет обновлять пользователя проекта, чтобы иметьДля авторитетного установите значение «истина», а для предыдущего доверенного пользователя - «Полномочия».Другая проблема, с которой я столкнулся, это то, что во второй раз я устанавливаю authoritative_user для проекта, для project_id предыдущего ProjectUser устанавливается значение nil, и поэтому он больше не ассоциируется, хотя Project_users проекта.

Я не уверен, что еслиЯ просто делаю это совершенно неправильно, или если я что-то упускаю.

Ответы [ 2 ]

3 голосов
/ 25 сентября 2010
class Project < ActiveRecord::Base
  has_many :project_users
  has_many :users, :through => :project_users

  belongs_to :authoritative_project_user, :class_name => 'ProjectUser'
  has_one    :authoritative_user, :through :authoritative_project_user
end

class  ProjectUser < ActiveRecord::Base
  belongs_to :project
  belongs_to :user

  has_one :project_as_authorized_user
end

тогда просто позвольте отношению has_one project_as_authorized_user обнулить вашу принадлежность_ авторизованному_проекту_пользователя

1 голос
/ 24 сентября 2010

Лично я, вероятно, посмотрю бы, чтобы упростить / разделить проблемы.Вот пример (примечание: не проверено):

class Project < ActiveRecord::Base
  has_many :project_users
  has_many :users, :through => :project_users
  has_one :authoritative_user
end

class  ProjectUser < ActiveRecord::Base
  belongs_to :project
  belongs_to :user
end

class AuthoritativeUser < ActiveRecord::Base
  belongs_to :project
  belongs_to :user

  validates_uniqueness_of :user_id, :scope => :project_id
end

По сути, я разделяю атрибут authoritative_user вашей ProjectUser модели на собственный.Очень просто, чисто и не очень увлекательно.

Возможно, вы могли бы создать несколько удобных методов, таких как has_authoritative_user? и update_authoritative_user, в своей модели Project.

Я уверен, что выЯ получу несколько лучших предложений.

Надеюсь, это поможет!

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