5

我有一个管理借方和贷方的发票系统。基本上,发票金额是通过其借记金额获得的,余额是通过取得其信用总额并将其减去总金额得出的。Rails类名/类型不适用于多态has_many:通过

我正在用四个模型做这个。

  1. 发票
  2. 行项目
  3. 借记
  4. 信用

它的工作原理是通过一个连接模型(行项目)的方式,具有多态关联叫做录制。一切似乎乍一看正常工作。 但是,检查订单项显示,虽然recordable_id显示正常,但recordable_type为零。

这里是一个休息的代码了下来:

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 

任何人都可以点我到这里的正确方向?

+0

如何将line_items分配给信用卡/借记卡? – Nazar 2010-01-23 16:20:02

+0

这会通过has_many:through自动发生。因此,当您执行Invoice.last.credits << Credit.new时,将自动生成LineItem并使用正确的recordable_id和invoice_id进行构建。 – 2010-01-23 22:55:46

+0

':as'不应该放在'has_many:line_items'上,而不是'has_many:through'关联? – mckeed 2010-01-25 22:58:46

回答

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"创建一个记录hod credit,它通过学分搜索recordable_id引用的记录。请注意,这里忽略了recordable_type
  4. 分别适用于belongs_to :debit

由于您的LineItem可能仅属于任何一个信用它是没有意义的附加声明这些关联借记。你可以通过recordable关联来参考这些。

0

Invoice.last.credits < < Credit.new

这是对我难倒,为什么recordable_type没有被拾起分配协会的正确方法。

的救命稻草在这里,但你尝试过:

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

使用多种类多到多加入Rails的表,这是经常被使用has_many_polymorphs插件解决时,我个人有问题。

对不起,这并不直接回答你的问题。

+0

是的,我最终创建了一个直接的关系,因为应用程序的行为不再需要发票到借方的多对多关系。我不知道为什么它没有选择它。过去我为不同的对象做了相同的准确设置。也许我偶然发现了一个受保护的名字,但我想不起来。最初我使用item_id和item_type,但即使更改为recordable_id并键入它仍然无法工作。完全难倒。 – 2010-01-25 04:07:39