我想知道如何最好地构建一些Rails模型,以便它们可以支持不同数量的输入字段。
假设我有一个属于主题模型的文章模型。我想拥有任意数量的主题,我希望允许每个主题定义它自己的字段。例如,theme_1可能会定义primary_colour,而theme_2可能会定义colour_1,colour_2和font。
基本上,主题的选择决定了文章需要收集哪些额外信息才能正确应用主题。
如果article_1正在使用theme_1,那么每当我渲染article_1时,我都需要存储一个primary_color值。如果article_2也使用theme_1,我希望能够定义不同的primary_color值。同样,如果article_3使用theme_2,那么我需要存储color_1,color_2和font。
主题定义了必填字段,所需的值对于文章来说是唯一的。
到目前为止,我已经提出了以下内容,但我不相信它是最佳解决方案:
class Article < ActiveRecord::Base
belongs_to :theme
has_many :article_details
end
class Theme < ActiveRecord::Base
has_many :fields
end
class ArticleDetail < ActiveRecord::Base
belongs_to :field
belongs_to :listing
end
文章有一个主题,一个主题有字段,所以我知道我需要填写文章的哪些字段。文章还有article_details,其中我存储了一个值和对该值所在字段的引用。
我希望我的说明清楚。任何反馈都表示赞赏。
由于
答案 0 :(得分:0)
鉴于有多个潜在主题,并且您不打算根据所需字段进行查询更新,我建议使用散列列。所以像这样:
class Article < ActiveRecord::Base
# Columns on the articles table include:
# Indexed string called 'theme'
# text column (not string!) called 'fields'
serialize :fields
end
然后您将能够执行以下操作:
a = Article.new
a.fields = {color1: 'blue', color2: 'red', fontFamily: 'Verdana'}
a.save
答案 1 :(得分:0)
我认为我过度思考这个解决方案。如果Article在Theme上有多态关联,那么我可以用我们自己的字段集定义n个主题:
class CreateArticles < ActiveRecord::Migration
def change
create_table :articles do |t|
t.references :theme, polymorphic: true, index: true
end
end
end
class Article < ActiveRecord::Base
belongs_to :theme, polymorphic: true
end
class MyTheme < ActiveRecord::Base
has_one :article
end
此时如果MyTheme
定义primary_color
我可以这样做:
article = Article.new
article.theme = MyTheme.new(primary_color: 'blue')
article.save
article.theme.primary_color
=> 'blue'
暂时无论如何,满足我所寻找的目标。