質問

借方と貸方を管理する請求システムがあります。基本的に、請求金額は借方の合計によって取得され、残高は貸方の合計を取得して合計金額から差し引くことによって導出されます。

4つのモデルでこれをやっています。

  1. 請求書
  2. ラインアイテム
  3. デビット
  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 あなたのクラスでこれを行います:

  1. belongs_to :invoice メソッドを作成します invoice を検索する 請求書 によって参照されるレコードのテーブル invoice_id
  2. belongs_to :recordable, :polymorphic => true メソッドを作成します recordable を検索する recordable_type.underscore.pluralize によって参照されるレコードのテーブル recordable_id
  3. belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id" メソッドを作成します credit を検索します クレジット によって参照されるレコードのテーブル recordable_id. 。ご了承ください recordable_type ここでは無視されます。
  4. 同じことが当てはまります 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 プラグイン。

ご質問に対する直接の回答ではなく、申し訳ありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top