Ruby on rails RubyonRails上的订阅

Ruby on rails RubyonRails上的订阅,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个模型有三个字段,active,start\u-suscription,end\u-suscription,active是布尔值,I如果是真的,是因为订阅没有完成,我的问题是如何让rails在订阅结束时自动将其更改为false,在django中,这很容易,但我只是从rails开始,我不知道。我建议您不要使用其他列来“缓存”可以轻松计算的信息: 如果删除列active,则可以通过定义实例方法active?,确定单个记录是否处于活动状态: # in your model def active?

我有一个模型有三个字段,
active
start\u-suscription
end\u-suscription
active是布尔值,I如果是真的,是因为订阅没有完成,我的问题是如何让rails在订阅结束时自动将其更改为false,在django中,这很容易,但我只是从rails开始,我不知道。

我建议您不要使用其他列来“缓存”可以轻松计算的信息:

如果删除列
active
,则可以通过定义实例方法
active?
,确定单个记录是否处于活动状态:

# in your model
def active?(as_of_date = Date.current)
  (start_suscription..end_suscription).include?(as_of_date)
end
# usage
instance = YourModel.new(start_suscription: Date.yesterday, end_suscription: Date.tomorrow)
instance.active? # => true
instance.active?(Date.current + 1.week) # => false
要获取所有活动记录,请创建一个作用域:

scope :active, -> (as_of_date = Date.current) { where('? BETWEEN start_suscription AND end_suscription', as_of_date) }
# usage
YourModel.active
YourModel.active(Date.yesterday)


如果您想坚持使用缓存列(我强烈建议您不要使用),则需要一个worker(每隔X个时间触发一次)来抓取所有现在处于非活动状态的记录,并更新其
活动列。

如果活动是一个数据库字段,您可以在订阅模型中创建回调,如

before_save :set_active

def set_active
self.active = self.start_subscription >= Date.today and self.end_suscription <= Date.today
end
保存前:将\u设置为活动状态
def设置_激活

self.active=self.start\u subscription>=Date.today和self.end\u subscription因此,如果我将来进行subscription,我会将我的
active
属性设置为
active
,即使它尚未启动?