Проверяет ассоциацию объекта - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть странный случай в моей разработке рельсов, которым я не могу правильно управлять.По сути, у меня есть три объекта: домен, проект и человек;домен - это группа лиц и проектов.Домены могут иметь несколько проектов, и проекты могут иметь несколько человек, однако проект может быть только в одном домене, и люди могут работать только для проектов в одном домене.

Я представлял его следующим образом:

class Domain < ActiveRecord::Base
    has_many :projects

class Project < ActiveRecord::Base
    belongs_to :domain
    has_and_belongs_to_many :persons

class Person < ActiveRecord::Base
    belongs_to :domain
    has_and_belongs_to_many :projects

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

Видите ли вы чистое решение этой проблемы?

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Итак, в основном вы хотите проверить, что человек принимает проекты только из одного домена. Я полагаю, этот домен должен быть определен, то есть у человека должен быть столбец domain_id.

У вас также есть связь «многие ко многим», и, поскольку для этой ассоциации требуются некоторые проверки, у вас должна быть также модель соединения (вместо таблицы без модели). Я назвал это Work. Итак, у меня есть это:

class Domain < ActiveRecord::Base
  has_many :projects
end

class Project < ActiveRecord::Base
  belongs_to :domain

  has_many :works
  has_many :persons, :through => :works
end

class Work < ActiveRecord::Base
  belongs_to :project
  belongs_to :person
end

class Person < ActiveRecord::Base
  has_many :works
  has_many :projects, :through => :works
end

Теперь, к Work модели вы просто добавляете

validate :projects_belong_to_apropriate_domains

def projects_belong_to_apropriate_domains
  if person.domain_id != project.domain.id
    errors[:base] << "A person may only take a project which belongs to his domain."
  end
end

Это сработало для меня. Это то, что вы хотели?

0 голосов
/ 23 февраля 2012

Вы можете настроить пользовательский метод проверки для Person (взято из rails guides )

validates :check_project_domain

def check_project_domain
  projects.all.each do |p|
    next if domains.exists?(p.domain.id)
    errors.add :project_domain "#{p} is not a member of allowed domains"
  end
end

Я не уверен, что вы можете позвонить exists в ассоциацииесли нет, то вы можете заменить его на что-то вроде:

domains.all.collect { |d| d.id }.include?(p.domain.id)

или даже:

domains.where(:id => p.domain.id).count > 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...