emr*_*ass 19 ruby-on-rails associations has-many
我有一个简单的rails应用程序,包含模型项目和阶段.一个项目有很多阶段,但只有阶段可以一次激活(即"当前").我仍然希望其他阶段可以访问,但当前阶段应该是应用程序的主要锚点.关于如何实现此要求的决定对我如何处理模型访问,验证和创建更新的视图/表单具有重大影响.
所以问题是:如何在不增加太多复杂性的情况下实现这种"has_many但只有一个当前的关联"?主要目标是:简化当前阶段的访问+确保一次不能超过1个活动阶段.
当然,我自己也有一些想法,想出了三个选项,我想在这里提出.任何关于为什么我应该选择一个选项而不是另一个选项(或建议更简单的解决方案)的反馈将不胜感激:
第一选择:
[Project] has_many :phases
[Project] has_one :current_phase, :class_name => "Phase", :conditions => { :current => true }
Run Code Online (Sandbox Code Playgroud)
缺点:我有一个用于创建项目和相应阶段的嵌套表单.似乎没有简单的方法可以将新创建的一个阶段设置为活动状态
第二种选择:
[Project] has an attribute "current_phase_id"
[Project] has_many :phases
[Project] belongs_to phase, :foreign_key => "current_phase_id"
Run Code Online (Sandbox Code Playgroud)
缺点:与选项1相同,但我有另一个属性和belongs_to关联,这似乎很奇怪(为什么一个项目属于其中一个阶段?)
第三种选择:
[Phase] has an attribute "active" (boolean)
[Phase] scope :active, :conditions => { :active => true}
# Access to current phase via: project.phases.active
Run Code Online (Sandbox Code Playgroud)
缺点:我必须通过验证确保一次只有一个活动阶段,如果同时创建/编辑多个阶段或从一个阶段切换到另一个阶段,则很难; 加:project.phases.active返回一个数组,如果我没有弄错的话
非常感谢您的帮助.谢谢!
增加了奖励以鼓励就该主题提出进一步意见.Bounty将获得最佳解决上述主要目标的解决方案; 或者如果没有提到替代解决方案,那么答案最能解释为什么我应该支持给定选项中的一个而不是另一个.谢谢!
edg*_*ner 18
你为什么不只是添加一个名为日期时间列activated_at到你的Phase模型.然后,只要您想激活相位,就将其设置为当前时间.
在任何给定时间,具有最新activated_at值的阶段是当前阶段,因此您可以获得它@project.phases.order('activated_at DESC').first.只需将其包装在一个方法中Project,您就会有一个非常简洁的表示:
# in project.rb
def current_phase
phases.where("activated_at is NOT NULL").order('activated_at DESC').first
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2838 次 |
| 最近记录: |