加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:42:09 所属栏目:百科 来源:网络整理
导读:我有一个简单的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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读