从关联表Ruby on Rails获取第一个条目

时间:2016-08-08 15:10:26

标签: ruby-on-rails ruby-on-rails-4 activerecord

我有一对多的关系:用户有很多付款。我正在尝试查找获得每个用户第一笔付款的查询(使用付款表中的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。

谢谢:)

6 个答案:

答案 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_bymap,但由于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