gpt4 book ai didi

ruby - 动态添加 ActiveRecord 作用域

转载 作者:数据小太阳 更新时间:2023-10-29 08:57:31 27 4
gpt4 key购买 nike

我有很多使用日期范围来做某事的范围,例如点击之间(开始日期,结束日期)。我还想支持添加一个学年字符串,其中我们有一个具有开始和结束方法的现有 SchoolYear。

我可以这样做:

scope :clicks_during, -> (year) {
year = Year.new(year) if year.is_a?(Integer)
send('clicks_between', year.start, year.end)
}

但是,我不想到处复制和粘贴这段代码。如果“介于”范围已经存在,是否有办法动态添加此范围?

最佳答案

应用关注点的概念,您可以将模块内的相关范围组合在一起,并根据需要将该模块包含在模型中。此外,由于您的范围确实接受参数,因此使用类方法是代替范围的首选方法。更多请查看Passing in arguments.

module Clickable
extend ActiveSupport::Concern

class_methods do
def clicks_between(start_date, end_date)
# ...
end

def clicks_during(year)
year = Year.new(year) if year.is_a?(Integer)
send('clicks_between', year.start, year.end)
end
end
end

在你的模型中:

class SomeModel < ActiveRecord::Base
include Clickable
end

class OtherModel < ActiveRecord::Base
has_many :some_models
end

现在您可以像往常一样调用作用域了:

SomeModel.clicks_during(2017)
other_model.some_models.clicks_during(2017)

ActiveSupport::Concern api

关于ruby - 动态添加 ActiveRecord 作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47646794/

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