我正在构建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?
答案 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
时,你就会做错事。