gpt4 book ai didi

ruby-on-rails - 在模型上使用 if 和范围

转载 作者:行者123 更新时间:2023-12-03 16:01:52 24 4
gpt4 key购买 nike

我正在尝试创建一个名为 :current_season 的命名范围,它可以正确识别与我们所在年份相关的记录。除了我希望六月及以后的所有内容都使用当前年份以及六月之前的所有内容使用前一年。

在 Rails 3.1 中,我可以轻松使用:

scope :current_season, lambda { where('season = ?',Time.now.year) } if Time.now.month >= 6

使范围仅在我们在年底时才起作用并且:
scope :current_season, lambda { where('season = ?',Time.now.year - 1) } if Time.now.month < 6

但是,必须将其全部命名两次而不使用 if/else 类型或能够调用我在下面定义的内容来显示确切的年份似乎很浪费,例如:
scope :current_season, lambda { where('season = ?',:current_season_year) } 

def current_season_year
if Time.now.month >= 6
Time.now.year
else
Time.now.year - 1
end
end

但是当我尝试时,这只是在 mock 我。有更干净的方法吗?我也将有一个范围 :last_season 和范围 :previous_season 最有可能,它们将遵循类似的逻辑。

提前感谢您的任何建议!

最佳答案

命名范围只是用于编写类方法的 DSL,这些方法都具有相似的功能。每当您发现它们限制您时,只需切换到类方法即可:

def self.current_season
year = Time.now.month >= 6 ? Time.now.year : Time.now.year - 1
where('season = ?', year)
end

当然,您也可以将其包含在这样的范围内:
scope :current_season, do
# same code as above...
end

不过,它只是将它定义为模型上的类方法。权衡是范围意图的明确性(它预计会返回一个可链接的 ActiveRecord::Relation )与文档的清晰度(如果您运行类似 RDoc 的东西,它不会注意到 Model.current_season 中可用的方法,因为它没有” t 尚未在代码中定义)。

更新:

使用作用域而不是类方法还有一个额外的好处:
User.admin.create name: 'Corey'  #=> <User: @name="Corey" @admin=true>

您也可以使用范围来创建具有某些参数的对象。在这种情况下,这不是很有用,但在决定使用哪个时值得考虑。

关于ruby-on-rails - 在模型上使用 if 和范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7591192/

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