【发布时间】:2019-12-10 13:22:47
【问题描述】:
我正在尝试创建一个范围,该范围将为我提供所有 clients 在他们拥有 :transitioned_to_maintenance(我们内部使用的术语)之后创建 purchase。
我的模型和范围组织如下:
class Client < ApplicationRecord
has_many :program_transitions
has_many :purchases
scope :transitioned_to_maintenance, -> { where(id: ProgramTransition.to_maintenance.pluck(:client_id)) }
scope :has_purchases, -> { where(id: Purchase.pluck(:client_id)) }
end
class ProgramTransition < ApplicationRecord
belongs_to :client, required: true
scope :to_fm, -> { where(new_status: "full maintenance") }
scope :to_lm, -> { where(new_status: "limited maintenance") }
scope :to_maintenance, -> { to_fm.or(to_lm)}
end
class Purchase < ActiveRecord::Base
belongs_to :client
end
我可以通过遍历客户端并选择符合我标准的客户端来完成我想要做的事情,但我希望通过一个范围可以实现。这是作为模型级别的函数:
def self.purchased_after_maintenance
clients = Client.transitioned_to_maintenance.has_purchases
final = []
clients.each do |client|
min_date = client.program_transitions.to_maintenance.first.created_at
final << client if client.purchases.last.created_at >= ? min_date
end
end
这是否可能与范围有关且无需遍历所有客户端?
【问题讨论】:
标签: ruby-on-rails associations