我在数据库中为表客户提供了以下数据
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] }]
有更好的方法吗?
由于
答案 0 :(得分:1)
Address
.where(code: "abc_1")
.where.not(customer_address: ['', nil])
.order(:updated_at)
.last
这并不一定能保证您的要求,因为您实际上存储&#34;地址最后更新时间是什么时候#34 ;;您只能在上次更新记录时存储。
所以这也可以是code
改变的时候。但是,考虑到当前的数据模型,这是您能做的最好的事情。
这种方法比原始方法更好,因为整个查询是在单个SQL语句中执行的,并且没有其他记录加载到内存中。