我有以下代码来查找列值为$ site
的最后一个条目record = UsageHistory.last(site: $site)
但是当我运行它时我得到一个异常
can't convert Hash into Integer (TypeError)
任何指针?
答案 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
的更多信息