我有这些疑问:
initial_date = NewUser.joins(:interactions)
.where('interactions.interaction_sub_type in (?)', types)
.where('interactions.interaction_type in (?)', actions)
.limit(1000).order('users.id asc').minimum(:updated_at)
last_date = NewUser.joins(:interactions)
.where('interactions.interaction_sub_type in (?)', types)
.where('interactions.interaction_type in (?)', actions)
.limit(1000).order('users.id asc').maximum(:updated_at)
除minimum
和maximum
外,它们几乎相同
我试图改进这个代码,但我不知道如何改变它。
我想到了像
base = NewUser.joins(:interactions)
.where('interactions.interaction_sub_type in (?)', types)
.where('interactions.interaction_type in (?)', actions)
.limit(1000).order('users.id asc')
initial_date = base.minimum(:updated_at)
但由于某种原因,这不起作用。好像ActiveRecord执行base
的查询,然后在initial_date
上再次执行。
答案 0 :(得分:3)
您考虑过使用scope
:
# in your `new_user` Model
scope :with_interactions, ->(types, actions) {
where('interactions.interaction_sub_type in (?)', types).
where('interactions.interaction_type in (?)', actions).
limit(1000).order('users.id asc')
}
可以使用:
initial_date = NewUser.with_interactions(types, actions).minimum(:updated_at)
last_date = NewUser.with_interactions(types, actions).maximum(:updated_at)
答案 1 :(得分:1)
自从我在Rails上工作已经很长时间了,但是我想尝试一下。
NewUser.joins(:interactions)
.select("MIN(updated_at) AS initial_date, MAX(updated_at) AS last_date")
.where('interactions.interaction_sub_type in (?)', types)
.where('interactions.interaction_type in (?)', actions)
.limit(1000).order('users.id asc')
它将返回包含2列initial_date
和last_date