【问题标题】:Rails class name/type not working for a polymorphic has_many :throughRails 类名称/类型不适用于多态 has_many :通过
【发布时间】:2011-01-08 13:42:31
【问题描述】:

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

我用四个模型来做这个。

  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

谁能在这里指出我正确的方向?

【问题讨论】:

  • 如何将 line_items 分配给贷方/借方?
  • 这通过 has_many :through 自动发生。因此,当您执行 Invoice.last.credits
  • 不应该是:ashas_many :line_items,而不是has_many :through 关联?
  • 否,因为 invoice_id 是 line_item 对象上的一个字段。多态性仅适用于确实使用 :as 在其 :has_many 声明中的借方和贷方对象。

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


【解决方案1】:

您在 LineItem 类上声明了模棱两可的关联。

简而言之,belongs_to 在你的课堂上这样做:

  1. belongs_to :invoice 创建一个方法 invoice,它在 invoices 表中搜索 invoice_id 引用的记录
  2. belongs_to :recordable, :polymorphic =&gt; true 创建一个方法 recordable,它在 recordable_type.underscore.pluralize 表中搜索 recordable_id 引用的记录
  3. belongs_to :credit, :class_name =&gt; "Credit", :foreign_key =&gt; "recordable_id" 创建一个方法credit,它在credits 表中搜索recordable_id 引用的记录。请注意,recordable_type 在这里被忽略。
  4. 同样适用于belongs_to :debit

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

【讨论】:

    【解决方案2】:

    Invoice.last.credits

    这是将关联分配给我的正确方法,我很困惑为什么没有收到 recordable_type

    在这里抓着稻草,但你尝试过吗:

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

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

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

    【讨论】:

    • 是的,我最终只是创建了直接关系,因为应用程序的行为不再需要发票与借方的多对多关系。我不确定为什么它也没有捡起它。过去,我对不同的对象进行了相同的精确设置。也许我偶然发现了一个受保护的名称,但我想不起来。最初我使用的是 item_id 和 item_type 但即使更改为 recordable_id 并键入它仍然无法正常工作。完全被难住了。
    猜你喜欢
    • 2020-02-24
    • 2013-07-06
    • 2017-06-29
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    相关资源
    最近更新 更多