我有一对多的关系:用户有很多付款。我正在尝试查找获得每个用户第一笔付款的查询(使用付款表中的created_at)。
我在SQL响应中发现了类似的问题,但我不知道如何使用Active Record编写它。
how do I query sql for a latest record date for each user
引用答案:
select t.username, t.date, t.value
from MyTable t
inner join (
select username, max(date) as MaxDate
from MyTable
group by username
) tm on t.username = tm.username and t.date = tm.MaxDate
对我而言,它将是min而不是max。
谢谢:)
答案 0 :(得分:0)
尝试使用POSTGRES
DWORD CALLBACK RawEntryPoint(void);
对于SQL
Payment.select("DISTINCT ON(user_id) *").order("user_id, created_at ASC")
答案 1 :(得分:0)
如果我要回答上述问题:(我不基于给定的原始SQL )
用户有很多付款。我正在尝试查找获得每个用户第一笔付款的查询(使用付款表中的created_at)。
Let say:
# Assumed to have a Single User, as reference
user = User.first
# Now, get first payment (from Payment model)
user.payments.last
# .last since it will always get the first created row by created_at.
如果我完全明白你要做什么。我不知道为什么你需要最大或最小日期?
答案 2 :(得分:0)
这个怎么样?
如果您想首先支付每个用户
dates = Payment.group(:user_id).minimum(:created_at).values
payments = Payment.where(created_at: dates)
付款也可以找到用户。
我认为你有用户名作为外键,你可以相应地改变。 :) 如果您遇到任何问题,请告诉我,因为我测试了它。
我知道这个答案不是最好的,但它会工作甚至是毫秒差异的事务,因为rails会将日期(created_at和updated_at)保存为ms级别。
答案 3 :(得分:0)
我很抱歉没有回复所有内容,但经过多次测试后,这是我最快的答案(在运行时):
Payment.where(:id => Payment.group(:user_id).pluck(:id))
我说它可能不是最快捷的方式,因为我使用的是子查询。我获得了独特的价值并得到了ID:
Payment.group(:user_id).pluck(:id)
然后我匹配这些ID。
这样做的不利之处在于它获得了最后一笔付款而无法扭转工作。
还有可能使用group_by
和map
,但由于map
来自红宝石,因此需要花费更多时间。
答案 4 :(得分:-1)
我不确定但是试试这个:
在您的控制器中:
def Page
@payments = Payment.first
end
你的html.erb中的:
<% @payments.each do |payment| %>
<p> <%= payment.amount %> </p>
希望这有帮助!
答案 5 :(得分:-1)
Record.association.order(:created_at).first