このドメインモデルは非常に複雑な関係を必要とするので、最初の試行でそれを得られないということは恥ずかしいことではありません。
class User < ActiveRecord::Base
has_many :claims, foreign_key: 'claimant_id',
inverse_of: :claimant
end
class Claim < ActiveRecord::Base
belongs_to :claimant, class_name: 'User',
inverse_of: :claims
end
これは、ひねりを加えた多くの関係にかなり基本的なものである:
は、ユーザーおよび特許請求の範囲で始めることができます。ユーザーは主張との関係がたくさんあるので、関係の性質が定義されるように、デフォルトのuser
以外の関係を呼び出します。
class_name: 'User'
オプションは、ActiveRecordにクラスUserをロードし、それを使用して照会するテーブルと結果を返すクラスを特定します。クラス名が連想の名前から直接派生することができないときはいつでも必要です。このオプションは文字列でなければならず、Railsがクラスの依存関係を遅延解決するために定数でなければなりません。
ここでコミッショナルロールを追加できます。私たちは、参加するテーブルとしてruling
を使用します。ここでは、我々は明確にするためcommissioner
を呼び出して、ユーザーとの関係を持っていることを
class Ruling < ActiveRecord::Base
belongs_to :claim
belongs_to :commissioner, class_name: 'User'
end
注意してください。今、私たちはClaim
に関係を追加します。
class Claim < ActiveRecord::Base
belongs_to :claimant, class_name: 'User',
inverse_of: :claims
has_many :rulings
has_many :commissioners, through: :rulings
end
その後、我々は、ユーザー側の関係をセットアップする必要があります。
class User < ActiveRecord::Base
has_many :claims, foreign_key: 'claimant_id',
inverse_of: :claimant
# rulings as claimant
has_many :rulings, through: :claims
has_many :rulings_as_commissioner, class_name: 'Ruling',
foreign_key: 'commissioner_id'
has_many :claims_as_commissioner, through: :rulings_as_commissioner,
source: :claim
end
は、我々は我々が参加テーブルから対象となるパーティのActiveRecordを伝えるsource: :claim
オプションに注意してください。 。
もちろん、これを行うには、列と外部キーを適切に設定する必要があります。これらの移行は最初からテーブルを作成することですが、簡単にあなたの既存のテーブルを変更するためにそれらを書き換えることができます。これは本当に団体の一部ではない、むしろあなたが検証を追加することで、この規則を施行う
class CreateClaims < ActiveRecord::Migration
def change
create_table :claims do |t|
t.belongs_to :claimant, index: true, foreign_key: false
t.timestamps null: false
end
# we need to setup the fkey ourself since it is not conventional
add_foreign_key :claims, :users, column: :claimant_id
end
end
class CreateRulings < ActiveRecord::Migration
def change
create_table :rulings do |t|
t.belongs_to :claim, index: true, foreign_key: true
t.belongs_to :commissioner, index: true, foreign_key: false
t.timestamps null: false
end
add_foreign_key :rulings, :users, column: :commissioner_id
add_index :rulings, [:claim_id, :commissioner_id], unique: true
end
end
max numbers of commissars = 3 per claim
かアソシエーションコールバック
class Ruling < ActiveRecord::Base
# ...
validate :only_three_rulings_per_claim
private
def only_three_rulings_per_claim
if claim.rulings.size >= 3
errors.add(:claim, "already has the max number of commissars")
end
end
end
参照:
'Ruling'モデルを提示してください。 – jvillian
'クラスの判決
Nikos4Life
、感謝 – Nikos4Life