【问题标题】:Get first entry from an associated table Ruby on Rails从关联表 Ruby on Rails 中获取第一个条目
【发布时间】:2016-12-14 10:31:54
【问题描述】:

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

谢谢你:)

【问题讨论】:

  • 您期望的结果是什么样的?所有付款?或者他们也必须和他们的用户一起来?

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


【解决方案1】:

为 POSTGRES 试试这个

Payment.select("DISTINCT ON(user_id) *").order("user_id, created_at ASC")

对于 SQL

Payment.group(:user_id).having('created_at = MAX(created_at)')

【讨论】:

  • 我不能使用循环,我正在尝试在一个查询中完成所有操作。实际上,我需要 @user.payments.first 从一个查询中为每个用户提供。
  • 请查看更新后的答案。希望它会为您服务
  • @FakhirShad 对于 SQL 之一,我认为应该是 MIN(created_at)
  • 是的,您可以根据需要使用最小值或最大值。 Mix 将为您提供有史以来的第一笔付款,而 max 将检索最后一笔付款
【解决方案2】:

我不确定,但试试这个:

在你的控制器中:

  def Page
    @payments = Payment.first
  end

在你的 html.erb 中:

<% @payments.each do |payment| %>
  <p> <%= payment.amount %> </p>

希望有帮助!

【讨论】:

  • 我正在寻找一个查询,而不是一个循环,正如我在另一个问题中所说:)
【解决方案3】:
Record.association.order(:created_at).first

【讨论】:

    【解决方案4】:

    如果我要回答上面的问题:(我不基于给定的原始 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.
    

    如果我完全理解你想要做什么。我不知道您为什么需要最大或最小日期

    【讨论】:

      【解决方案5】:

      这个怎么样?

      如果您希望每个用户都先付款

      dates = Payment.group(:user_id).minimum(:created_at).values
      payments = Payment.where(created_at: dates)
      

      您也可以从付款中找到用户。

      我认为你有用户名作为外键,你可以相应地改变。 :) 如果您遇到任何问题,请告诉我,因为我测试过它有效。

      我知道这个答案不是最好的,但它甚至可以工作或毫秒差异的事务,因为 rails 以 ms 级别保存日期(created_at 和 updated_at)。

      【讨论】:

        【解决方案6】:

        很抱歉没有回复所有内容,但经过多次测试,这是我得到的最快答案(在运行时):

        Payment.where(:id => Payment.group(:user_id).pluck(:id))
        

        我说这可能不是最快的方法,因为我使用的是子查询。我正在获取唯一值并获取 ID:

        Payment.group(:user_id).pluck(:id)
        

        然后我正在匹配那些 ID。

        这样做的缺点是它不会反向工作,以获得最后一笔付款。

        也可以使用group_bymap,但由于map 来自ruby,因此需要更多时间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-04-13
          • 1970-01-01
          • 2014-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多