活动记录查找错误

时间:2017-04-28 09:58:27

标签: ruby activerecord

我有以下代码来查找列值为$ site

的最后一个条目
record = UsageHistory.last(site: $site)

但是当我运行它时我得到一个异常

can't convert Hash into Integer (TypeError)

任何指针?

3 个答案:

答案 0 :(得分:2)

问题:

ActiveRecord::FinderMethods#last不会使用哈希参数。

解决方案:

nRows = tf.shape(length_label)[0] # ==> ?
nCols = tf.constant(MAX_LENGTH_INPUT + 1, dtype=tf.int32) # ==> 5
m1 = tf.reshape(tf.tile(tf.range(nCols), [nRows]),
                                       shape=[nRows, nCols])
m2 = tf.transpose(tf.reshape(tf.tile(tf.range(nRows), [nCols]),
                                        shape=[nCols, nRows]))
indices = tf.pack([m2, m1, idx], axis=-1)
# indices should be of shape [?, 5, 3] with indices[i,j]==[i,j,idx[i,j]]
output = tf.gather_nd(data, indices=indices)

请注意,其他两个给出的答案都会生成以下SQL

UsageHistory.where(site: $site)             # select all records matching the query
            .order(timestamp_column: :desc) # order by any timestamp column
            .first                          # take the first record (newest one)

这不正是您所需要的,因为SELECT usage_history.* FROM usage_history WHERE (site = your_site) ORDER BY usage_history.id DESC LIMIT $1 的排序不等于按时间戳列排序。

我的查询将返回SQL

id

两者都是对DB的单一查询,因此我更愿意保持明确。

答案 1 :(得分:-1)

您使用last是错误的,此方法仅将限制作为参数(最后N个记录,例如last(5))。 您可以在查询后使用last

UsageHistory.where(site: $site).last

此外,您可以将find_by与订单条件一起使用(效率较低):

Campaign.order(id: :desc).find_by(site: $site)

答案 2 :(得分:-1)

TL; DR: 你要做的是:

record = UsageHistory.where(site: $site).last

长版: 最后的' ActiveRecord中的方法:: FinderMethods不接受哈希。在这种情况下,您需要使用'其中'等方法对其进行链接。 您可以阅读有关ActiveRecord :: FinderMethods#last方法here

的更多信息