ruby-on-rails – 执行has_many但是只有一个当前关联的“rails方式”是什么?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 执行has_many但是只有一个当前关联的“rails方式”是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个简单的rails应用程序与模型项目和阶段.一个项目有许多阶段,但是只能在同一时刻才能有效(即“当前”).我仍然希望其他阶段可以访问,但是当前阶段应该是应用程序的主要锚点.关于如何实现此要求的决定对于如何处理模型访问,验证和视图/表单以进行创建更新具有重大意义.

所以问题是:如何实现这个“has_many但只有一个当前的关联”,而不增加太多的复杂性?主要目标是:简化当前阶段的访问,确保一次不能超过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返回数组,如果我没有错误

您的帮助非常感谢.谢谢!

更新

增加了一个奖励来鼓励对这个话题的进一步意见.赏金将被授予最佳解决上述主要目标的解决方案;或者如果没有提及其他解决方案,那么最好的解释是为什么我应该赞成一个给定的选择.谢谢!

解决方法

为什么不要在Phase模型中添加一个名为activate_at的日期时间列.然后将其设置为当前时间,当您要使阶段激活时.

在任何给定的时间,具有最新的activate_at值的阶段是当前阶段,因此您可以使用@ project.phases.order(‘activated_at DESC’)获取它.只需将它包装在Project中的一个方法中,并且你有一个非常简洁的表示:

# in project.rb
def current_phase
  phases.where("activated_at is NOT NULL").order('activated_at DESC').first
end
原文链接:https://www.f2er.com/ruby/271717.html

猜你在找的Ruby相关文章