如何自动处理STI并建立相关模型?

时间:2014-12-31 09:47:56

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 sti

我正在构建CMS,我想为网页分配许多不同的内容,这些内容在网格和嵌入式模型(如插件和html片段)中具有共同位置。正如我所看到的那样,这些要求符合STI方法。 当我使用content_type和特定模型参数提供类似于(如果我没有错误)Content的参数时,如何自动构建继承的accepts_nested_attributes_for模型?

当前的STI逻辑:

class Page < ActiveRecord::Base
  # string :name
  # string :link
  has_many :contents
  has_many :plugin_contents
  has_many :html_contents
end

class Content < ActiveRecord::Base
  # string :content_type
  # string :name
  # integer :position
  # integer :page_id
  belongs_to :page
  self.inheritance_column = :content_type

  def content_type
    case content_type
    when 'plugin'
      Plugin.new
    when 'snippet'
      Html.new
    end
  end
end

class Plugin < Content
  # string :url_params
  # string :own_name
end

class Html < Content
  # string :snippet
end

如何构建它?我目前的方法,例如:

page = Page.new(name: "Main Page with Plugins", link: "mianpage")
content_plugin1 = page.contents.build
content_plugin1.content_type = "plugin"
content_plugin1.position = 0
# Next how to pass Plugin params?

1 个答案:

答案 0 :(得分:2)

您应该可以像这样定义关联:

class Page < ActiveRecord::Base
  has_many :contents
  has_many :plugins
  has_many :htmls
end

class Content < ActiveRecord::Base
  belongs_to :page
end

class Plugin < Content
end

class Html < Content
end

然后你可以创建e.q.相关的plugin就像这样:

page = Page.create(name: "Main Page with Plugins", link: "mianpage")
plugin = page.plugins.build(
  name: 'foo', url_params: 'bar', own_name: 'baz', position: 0
)
plugin.save

经验法则是:每当你自己开始设置STI type时,你就会做错事。