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

时间:2017-11-28 15:05:31

标签: ruby ruby-on-rails-4

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

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">,
]>

我试过了

@address = @address.select { |h| h[:customer_address] != '' } if @address.any? { |h| h[:customer_address] == '' }
@address = [@address.max_by { |h| h[:created_at] }]

有更好的方法吗?

由于

1 个答案:

答案 0 :(得分:1)

Address
  .where(code: "abc_1")
  .where.not(customer_address: ['', nil])
  .order(:updated_at)
  .last

这并不一定能保证您的要求,因为您实际上存储&#34;地址最后更新时间是什么时候#34 ;;您只能在上次更新记录时存储。

所以这也可以是code改变的时候。但是,考虑到当前的数据模型,这是您能做的最好的事情。

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