Rails クラス名/型が多態性の has_many :through で機能しない
-
22-09-2019 - |
質問
借方と貸方を管理する請求システムがあります。基本的に、請求金額は借方の合計によって取得され、残高は貸方の合計を取得して合計金額から差し引くことによって導出されます。
4つのモデルでこれをやっています。
- 請求書
- ラインアイテム
- デビット
- クレジット
その仕組みは、recordable と呼ばれる多態性の関連付けを持つ結合モデル (ラインアイテム) を介して行われます。一見するとすべてが適切に機能しているように見えます。 ただし、項目を検査すると、recordable_id は正常に表示されますが、recordable_type が nil であることがわかります。
コードの内訳は次のとおりです。
class Invoice < ActiveRecord::Base
has_many :line_items, :dependent => :destroy
has_many :debits, :through => :line_items, :as => :recordable
has_many :credits, :through => :line_items, :as => :recordable
end
class LineItem < ActiveRecord::Base
belongs_to :invoice
belongs_to :recordable, :polymorphic => true
belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id"
belongs_to :debit, :class_name => "Debit", :foreign_key => "recordable_id"
end
class Credit < ActiveRecord::Base
has_many :line_items, :as => :recordable, :dependent => :destroy
end
class Debit < ActiveRecord::Base
has_many :line_items, :as => :recordable, :dependent => :destroy
end
誰かここで正しい方向を教えてくれませんか?
解決
あなたは曖昧な関連性を宣言しています LineItem
クラス。
一言で言えば、 belongs_to
あなたのクラスでこれを行います:
belongs_to :invoice
メソッドを作成しますinvoice
を検索する 請求書 によって参照されるレコードのテーブルinvoice_id
belongs_to :recordable, :polymorphic => true
メソッドを作成しますrecordable
を検索するrecordable_type.underscore.pluralize
によって参照されるレコードのテーブルrecordable_id
belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id"
メソッドを作成しますcredit
を検索します クレジット によって参照されるレコードのテーブルrecordable_id
. 。ご了承くださいrecordable_type
ここでは無視されます。- 同じことが当てはまります
belongs_to :debit
それぞれ。
LineItem はクレジットのいずれかにのみ属することができるため、 または 借方 これらの関連付けを追加で宣言することは意味がありません。これらは、 recordable
協会。
他のヒント
Invoice.last.credits << Credit.new
これは、関連付けを割り当てる正しい方法です。 recordable_type
取り上げられていない。
藁にもすがる思いですが、試してみたことはありますか?
Invoice.last.credits << Credit.create(:value => 1, :date => Time.now, ...)
私は個人的に、Rails でマルチタイプの多対多結合テーブルを使用するときに問題を抱えていましたが、多くの場合、 has_many_polymorphs
プラグイン。
ご質問に対する直接の回答ではなく、申し訳ありません。
所属していません StackOverflow