Ruby 从活动记录关系中获取特定记录

Ruby 从活动记录关系中获取特定记录,ruby,ruby-on-rails-4,Ruby,Ruby On Rails 4,我在数据库中为表customer提供了以下数据 id customer_address code created_at updated_at 1 abc_1 2017-11-21 02:58:04 2017-11-21 02:58:04 2 122 st. CA abc_1 2017-11-24 14:26:02 2017-11-24 14:26:02 3

我在数据库中为表customer提供了以下数据

id   customer_address     code       created_at            updated_at
1                         abc_1    2017-11-21 02:58:04  2017-11-21 02:58:04
2    122 st. CA           abc_1    2017-11-24 14:26:02  2017-11-24 14:26:02
3    224 st. CA           abc_1    2017-11-28 14:26:02  2017-11-28 14:26:02
第一条记录id=1的客户地址为空。每个客户的代码都是相同的。对于代码输入参数,我想返回具有最新地址的记录,因此在本例中记录id=3。 我在@address中有以下可用的activerecord关系

#<ActiveRecord: : Relation[
  #<Address id: 1,
  customer_address: “”,
  code: “abc_1”,
  created_at: "2017-11-21 02:58:04",
  updated_at: "2017-11-21 02:58:04">,
  #<Address id: 2,
  customer_address: “123 st.CA”,
  code: “abc_1”,
  created_at: "2017-11-24 14:26:02",
  updated_at: "2017-11-24 14:26:02">,
  #<Address id: 3,
  customer_address: “224 st.CA”,
  code: “abc_1”,
  created_at: "2017-11-28 14:26:02",
  updated_at: "2017-11-28 14:26:02">,
]>
有更好的方法吗

谢谢

这并不一定能保证你所问的是什么,因为你实际上并不存储地址上次更新的时间;您仅存储上次更新记录的时间

例如,这也可能发生在代码更改时。但是,在当前数据模型的情况下,这是您所能做的最好的

此方法比原始方法更好,因为整个查询在单个SQL语句中执行,并且没有其他记录加载到内存中。

@address.wherecustomer\u address:nil.orderupdated\u at ASC.last?
@address = @address.select { |h| h[:customer_address] != '' } if @address.any? { |h| h[:customer_address] == '' }
@address = [@address.max_by { |h| h[:created_at] }]
Address
  .where(code: "abc_1")
  .where.not(customer_address: ['', nil])
  .order(:updated_at)
  .last