我最近刚继承了一个Rails应用程序,正在讨论一个前进的架构决策。这里有一些背景......反馈意见。
目前有16种不同的广告类型,都有一组相同的属性,有几个有一个或两个附加属性,有几个有三个或四个。
目前,每种广告类型都有一个单独的模型和表格,其中包含相应的列,以及CMS中用于基本CRUD的单独控制器和视图。 CMS利用inherited_resources,因此限制了一些重复。
我写出了属性集 - 大约有20个左右,涵盖了所有广告类型。某些广告类型具有关联 - 几个has_many关联,其中外键存储在关联的表上,还有一些属于belongs_to。
广告没有真正的行为。特定的广告类型只显示在各个页面上,因此只要我能确定是否有特定类型的广告,我们就是金色的。
我正在讨论转移到单个模型,表和控制器,但希望从stackoverflow社区获得尽可能多的输入,以确定这是否1)适合问题2)任何性能问题3 )我没有的任何潜在的编程瓶颈。到目前为止,这是我的想法......
假设路线/:location /:ad_type / new(例如/ homepage / ad_type_1 / new):
ad_controller会创建@ad,并将ad_type设置为params [:location] + params [:ad_type]并渲染新视图,其中包含一系列条件,用于显示给定ad_type的相应部分。提交会触发创建广告的创建操作,其中包含为广告类型定义的预期属性,其中一个广告类型为ad_type = homepage_ad_type_1。
我没有考虑过检索数据,但假设ad_type列设置正确,我应该能够创建一个“of_type”范围,该范围根据ad_type列提取记录。不确定我是否遗漏了那些东西。
验证将根据ad_type值而有所不同。
我不确定在任何特定时间会有多少广告存在,但我觉得这可以在以后解决。将一些陈旧的行移到ad_archives表或类似的行。
您的意见表示赞赏。感谢。
答案 0 :(得分:1)
我可能会使用单个表模型,但如果使用多个控制器/视图是有意义的,则不必将自己局限于单个控制器,您仍然可以根据其类型查询广告使用条件。例如:
create_table :people do |t|
t.string first_name
t.string last_name
# some other properties...
t.string type
end
class Student < Person
end
class Teacher < Person
end
Person.all # shows all students and teachers
Teacher.all # shows all teachers
因此,制作教师控制器和学生控制器以及人员控制器会很容易。