【发布时间】:2011-07-11 10:28:11
【问题描述】:
我有一个带有模型项目和阶段的简单 Rails 应用程序。一个项目有许多阶段,但一次只能在一个阶段处于活动状态(即“当前”)。我仍然希望其他阶段可以访问,但当前阶段应该是应用程序的主要锚点。关于如何实现此要求的决定对我如何处理模型访问、验证和视图/表单以进行创建更新具有重大影响。
所以问题是:如何在不增加太多复杂性的情况下实现这种“has_many but has-only-one-current association”?主要目标是:简单地访问当前阶段 + 确保一次不能有超过 1 个活动阶段。
当然,我自己也有一些想法,想出了三个选项,我想在这里介绍一下。任何关于为什么我应该选择一个选项而不是另一个选项的反馈(或更简单的解决方案的建议)将不胜感激:
第一个选项:
[Project] has_many :phases
[Project] has_one :current_phase, :class_name => "Phase", :conditions => { :current => true }
缺点:我有一个用于创建项目和相应阶段的嵌套表单。似乎没有简单的方法可以将新创建的阶段之一设置为活动状态
第二个选项:
[Project] has an attribute "current_phase_id"
[Project] has_many :phases
[Project] belongs_to phase, :foreign_key => "current_phase_id"
缺点:与选项1相同,但我有另一个属性和belongs_to关联,这看起来很奇怪(为什么项目应该属于它的一个阶段?)
第三个选项:
[Phase] has an attribute "active" (boolean)
[Phase] scope :active, :conditions => { :active => true}
# Access to current phase via: project.phases.active
缺点:我必须通过验证确保一次只有一个活动阶段,如果同时创建/编辑多个阶段或从一个阶段切换到另一个阶段,这很难;加:project.phases.active 返回一个数组,如果我没记错的话
非常感谢您的帮助。谢谢!
更新
添加了赏金以鼓励对该主题提出进一步的意见。赏金将奖励给最能实现上述主要目标的解决方案;或者,如果没有提到替代解决方案,则最能解释为什么我应该偏爱给定选项之一的答案。谢谢!
【问题讨论】:
-
我更喜欢选项 2,它看起来很奇怪,我同意,但是您不需要额外的验证来检查当前的唯一性,也不需要更新数据库中的两条记录来更改当前的。
-
感谢您的反馈,@ryaz。我在下面的 edgerunner 中获得了最高投票的答案。更加优雅和易于处理。
标签: ruby-on-rails associations has-many