提案文档可以分为许多不同的部分类型(文本,费用,时间表等)
这里使用连接表上的多态关联建模。
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
#new doesnt
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
红宝石2.0 rails 3.2.14
答案 0 :(得分:3)
ActiveRecord无法知道proposal.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