Rails类名称/类型不适用于多态has_many:through

时间:2010-01-23 14:33:38

标签: ruby-on-rails ruby polymorphic-associations has-many-through

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

我正在用四种模式做这件事。

  1. 发票
  2. 订单项
  3. 借记
  4. 信用
  5. 它的工作方式是通过一个连接模型(Line Item),它具有一个名为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
    

    有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:3)

您在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,在{em> credits 表中搜索recordable_id引用的记录。请注意,此处忽略recordable_type
  4. 同样适用于belongs_to :debit
  5. 由于您的LineItem可能只属于Credit 借记,因此另外声明这些关联是没有意义的。您可以通过recordable关联来引用这些内容。

答案 1 :(得分:0)

Invoice.last.credits&lt;&lt; Credit.new

这是分配关联的正确方法,我很难理解为什么recordable_type没有被选中。

抓住稻草,但你试过了吗?

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

在Rails中使用多类型多对多连接表时,我个人遇到了问题,这通常是使用has_many_polymorphs插件解决的。

很抱歉,这不能直接回答您的问题。