5

我有一个管理借方和贷方的发票系统。基本上,发票金额是通过其借方的总和获得的,余额是通过将其贷方的总和减去总金额得出的。

我用四个模型做这个。

  1. 发票
  2. 订单项
  3. 借方
  4. 信用

它的工作方式是通过具有称为可记录的多态关联的连接模型(行项)。乍一看,一切似乎都正常工作。但是,检查行项目显示虽然 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创建一个方法,该方法在invoicesinvoice表中搜索由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"创建一个方法,该方法在credits表中credit搜索. 注意,这里忽略。recordable_idrecordable_type
  4. 同样适用于belongs_to :debit分别。

由于您的 LineItem 可能只属于 CreditDebit,因此额外声明这些关联是没有意义的。recordable您可以通过关联参考这些。

于 2010-01-28T11:00:11.983 回答
0

发票.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 回答