gpt4 book ai didi

ruby-on-rails - 强制has_many但只有一个当前关联的 “rails way”是什么?

转载 作者:行者123 更新时间:2023-12-03 12:47:05 25 4
gpt4 key购买 nike

我有一个带有模型项目和阶段的简单Rails应用程序。一个项目有多个阶段,但一次只能激活(即“当前”)阶段。我仍然希望其他阶段都可以访问,但是当前阶段应该是该应用程序的主要 anchor 。如何实现此要求的决定对我如何处理模型访问,验证以及用于创建更新的 View /表单具有重大影响。

所以问题是:如何在不增加太多复杂性的情况下实现这种“has_many但只有一个当前关联”?主要目标是:简化当前阶段的访问+确保一次不能超过一个 Activity 阶段。

当然,我本人也有一些想法,并提出了三个选项,我想在这里提出。关于为什么我应该选择一个选项而不是另一个选项的任何反馈(或提出一个更简单的解决方案的建议),将不胜感激:

第一个选项:

[Project] has_many :phases
[Project] has_one :current_phase, :class_name => "Phase", :conditions => { :current => true }

缺点:我有一个用于创建项目和相应阶段的嵌套表单。似乎没有简单的方法将新创建的阶段之一准确设置为 Activity 状态

第二个选项:
[Project] has an attribute "current_phase_id"

[Project] has_many :phases
[Project] belongs_to phase, :foreign_key => "current_phase_id"

缺点:与选项1相同,但是我有另一个属性和一个Emirates_to关联,这似乎很奇怪(为什么一个项目应该属于其阶段之一?)

第三种选择:
[Phase] has an attribute "active" (boolean)
[Phase] scope :active, :conditions => { :active => true}

# Access to current phase via: project.phases.active

缺点:我必须通过验证来确保一次只有一个 Activity 阶段,如果同时创建/编辑多个阶段,或者在从一个阶段切换到另一阶段的过程中,这很难做到;加:project.phases.active返回一个数组,如果我没记错的话

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

更新资料

增加了赏金,以鼓励对该主题发表更多意见。赏金将颁发给最能解决上述主要目标的解决方案;或者,如果未提及其他解决方案,则该答案可以最好地解释为什么我应该偏爱给定的一个选项。谢谢!

最佳答案

您为什么不只将activated_at的日期时间列添加到Phase模型中。然后,只要您想使一个相处于 Activity 状态,就将其设置为当前时间。

在任何给定时间,具有最新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

关于ruby-on-rails - 强制has_many但只有一个当前关联的 “rails way”是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6648792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com