0

给定一个ContentBlock模型:

class ContentBlock < ActiveRecord::Base
  has_one :block_association
  has_one :image, through: :block_association, source: :content, source_type: "Image"
  has_one :snippet, through: :block_association, source: :content, source_type: "Snippet"

  accepts_nested_attributes_for :image, allow_destroy: true
  accepts_nested_attributes_for :snippet, allow_destroy: true
end

块关联模型:

class BlockAssociation < ActiveRecord::Base
  belongs_to :content_block
  belongs_to :content, polymorphic: true
end

片段模型:

class Snippet < ActiveRecord::Base
  has_one :block_association, as: :content
  has_one :content_block, through: :block_association

  validates :body, presence: true
end

我需要去做:

@content_block.build_snippet

但这给出了:

undefined method 'build_snippet' for #<ContentBlock:0x007ffb7edde330>

我将如何达到预期的结果?

形式将是这样的:

<%= simple_form_for @content_block do |f| %>
  <%= f.simple_fields_for f.object.snippet || f.object.build_snippet do |sf| %>
    <%= sf.input :body %>
  <% end %>
<% end %>

(最初我认为这content_block很简单belong_to :content, polymorphic: true,但由于多种content类型,这似乎不够。)

这有点接近我正在做的事情,但我无法完全理解它:http: //xtargets.com/2012/04/04/solving-polymorphic-hasone-through-building-and -嵌套形式/

4

1 回答 1

0
class ContentBlock < ActiveRecord::Base      
  has_one :snippet, through: :block_association, source: :content, source_type: "Snippet"
end

这告诉 Rails,您希望 ContentBlock 的实例(让 content_block 这个实例)通过 BlockAssociation 拥有一个名为“snippet”的虚假类型“内容”的 Snippet 实例。因此,ContentBlock 实例应该能够响应 content_block.content ,这将返回片段和/或图像的集合(我在代码片段中省略了图像部分)。content_block 如何只调用没人知道的片段内容。

您的 BlockAssociation 模型知道什么:

class BlockAssociation < ActiveRecord::Base
  belongs_to :content_block
  belongs_to :content, polymorphic: true
end

它知道它属于 content_block 并且知道(因为它会响应内容)一个或多个具有 content_type('Snippet')和 content_id(1 或任何片段 id)的内容,它们的组合使关系与片段

现在你缺少的是片段部分:

class Snippet < ActiveRecord::Base
  has_one :block_association, :as => :snippet_content
  has_one :content_block, :through => :content_association # I'm actually not quite sure of this
end

它告诉 block_association 如何调用这种类型的内容,因为您想区分图像内容和片段内容。现在 content_block.snippet_content 应该返回片段,而 snippet.block_content 应该返回 block_content。

我希望我没有搞砸任何事情,这些关系总是让我头晕目眩

于 2014-01-24T17:00:38.907 回答