5

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

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

  1. 請求書
  2. ラインアイテム
  3. デビット
  4. クレジット

それが機能する方法は、recordableと呼ばれるポリモーフィックな関連付けを持つ結合モデル(Line Item)を介したものです。一見、すべてが正しく機能しているように見えます。ただし、ラインアイテムを調べると、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

誰かが私をここで正しい方向に向けることができますか?

4

2 に答える 2

3

クラスであいまいな関連付けを宣言していますLineItem

一言で言えば、belongs_toあなたのクラスでこれを行います:

  1. belongs_to :invoiceによって参照されるレコードの請求書テーブルinvoiceを検索するメソッドを作成しますinvoice_id
  2. belongs_to :recordable, :polymorphic => trueによって参照されるレコードをテーブルrecordableで検索するメソッドを作成しますrecordable_type.underscore.pluralizerecordable_id
  3. belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id"によって参照されるレコードをクレジットテーブルcreditで検索するメソッドを作成します。ここでは無視されることに注意してください。recordable_idrecordable_type
  4. 同じことがそれぞれに当てはまりbelongs_to :debitます。

LineItemはクレジットまたはデビットのいずれかにのみ属している可能性があるため、これらの関連付けを追加で宣言することは意味がありません。協会を通じてこれらを参照することができますrecordable

于 2010-01-28T11:00:11.983 に答える
0

Invoice.last.credits << Credit.new

これは、関連付けを割り当てる正しい方法です。なぜrecordable_typeが取得されないのかについて困惑しています。

ここでストローを握りしめていますが、試したことはありますか?

Invoice.last.credits << Credit.create(:value => 1, :date => Time.now, ...)

Railsでマルチタイプの多対多結合テーブルを使用するときに個人的に問題が発生しました。これは、has_many_polymorphsプラグインを使用することで解決されることがよくありました。

申し訳ありませんが、これはあなたの質問に直接答えるものではありません。

于 2010-01-24T11:02:11.940 に答える