2012-02-23 11 views
0

私のレール開発には、私が適切に管理できない奇妙なケースがあります。 基本的に、私は3つのオブジェクトを持っています:ドメイン、プロジェクト、人。ドメインは人とプロジェクトのグループです。ドメインは複数のプロジェクトを持つことができますが、プロジェクトには複数の人が参加することができますが、プロジェクトは1つのドメインにしか存在せず、人々は1つのドメインのプロジェクトでのみ作業できます。オブジェクトの関連付けを有効にします

私は次のように表されています

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 

私は人に追加されたすべてのプロジェクトが同じドメインに属していることを検証する方法がわかりません。人を検証するためのメソッドを作成しましたが、他のドメインにプロジェクトを追加することは可能ですが、データベースに保存されている人は有効ではありません。

この問題を解決するにはどうすればよいですか?

答えて

1

だから、基本的に、人が1つのドメインからのみプロジェクトを取得することを検証する必要があります。私は、このドメインを定義する必要があります。つまり、人は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

実際、それは動作します – Etienne

0

あなたは可能性があり、セットアップ(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 
+0

私は既にこのような解決策を試みましたが、新しい人物でプロジェクトを更新すると、人物オブジェクトが有効でない間にデータベースが更新されます – Etienne

関連する問題