代码之家  ›  专栏  ›  技术社区  ›  Jim Jeffers

不适用于多态性的Rails类名/类型有多个:到

  •  5
  • Jim Jeffers  · 技术社区  · 16 年前

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

    我用四个模型来做这个。

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

    它的工作方式是通过一个具有称为可记录的多态关联的连接模型(行项目)。乍一看,一切似乎都正常。 但是,检查行项目表明,虽然可记录的_id显示正常,但可记录的_类型为零。

    下面是代码的分解:

    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 回复  |  直到 12 年前
        1
  •  3
  •   mikezter    12 年前

    您正在声明您的 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_type 此处忽略。
    4. 同样适用于 belongs_to :debit 分别。

    因为您的行项目只能属于信用证 或 借项。另外声明这些关联是没有意义的。您可以通过 可记录 联想。

        2
  •  0
  •   James A. Rosen    16 年前

    invoice.last.credits<<credit.new

    这是给我分配关联的正确方式,我无法理解为什么 recordable_type 没有被接走。

    抓着稻草,你试过了吗?

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

    在Rails中使用多类型多对多连接表时,我个人遇到了一些问题,通常通过使用 has_many_polymorphs 插件。

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

    推荐文章