为什么Rails通过关联为多态连接孤儿记录



提案文件可以分成许多不同的部分类型(文本、费用、时间表)等

在这里,它是使用连接表上的多聚关联来建模的。

class Proposal < ActiveRecord::Base
  has_many :proposal_sections
  has_many :fee_summaries, :through => :proposal_sections, :source => :section, :source_type => 'FeeSummary'
end
class ProposalSection < ActiveRecord::Base
  belongs_to :proposal
  belongs_to :section, :polymorphic => true
end
class FeeSummary < ActiveRecord::Base
  has_many :proposal_sections, :as => :section
  has_many :proposals, :through => :proposal_sections 
end

#create可以正常工作

summary = @proposal.fee_summaries.create
summary.proposal == @propsal # true

#新不

summary = @proposal.fee_summaries.new
summary.proposal -> nil

应该返回nil吗?

在常规情况下,has_many和belongs_to初始化但未持久化的记录仍然会返回它们的父关联(内置在内存中)。

为什么不能工作,这是预期的行为吗?

Schema.rb

 create_table "fee_summaries", :force => true do |t|
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end
  create_table "proposal_sections", :force => true do |t|
    t.integer  "section_id"
    t.string   "section_type"
    t.integer  "proposal_id"
    t.datetime "created_at",   :null => false
    t.datetime "updated_at",   :null => false
  end
  create_table "proposals", :force => true do |t|
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

ruby 2.0rails 3.2.14

ActiveRecord不能知道该提案。Fee_summaries是fee_summary.proposal的反向关联。这是因为您可以定义自己的关联名称,对其进行附加约束等—自动派生出哪些关联是反向的,哪些关联是不可能的,如果不是不可能的话,那将是非常困难的。所以即使是最简单的情况,你也需要通过关联声明上的inverse_of选项显式地告诉它。下面是一个简单的直接关联示例:

class Proposal < ActiveRecord::Base
  has_many :proposal_sections, :inverse_of => :proposal
end
class ProposalSection < ActiveRecord::Base
  belongs_to :proposal, :inverse_of => :proposal_sections
end
2.0.0-p353 :001 > proposal = Proposal.new
 => #<Proposal id: nil, created_at: nil, updated_at: nil> 
2.0.0-p353 :002 > section = proposal.proposal_sections.new
 => #<ProposalSection id: nil, proposal_id: nil, created_at: nil, updated_at: nil> 
2.0.0-p353 :003 > section.proposal
 => #<Proposal id: nil, created_at: nil, updated_at: nil> 

不幸的是,inverse_of不支持间接(through)和多态关联。所以在你的情况下,没有简单的方法可以让它工作。我看到的唯一解决方法是持久化记录(使用create),这样AR就可以按键查询关系并返回正确的结果。

查看文档获取更多示例和解释:http://apidock.com/rails/ActiveRecord/Associations/ClassMethods

相关内容

  • 没有找到相关文章

最新更新