0

这个问题的答案应该很简单,但我还没有通过活动记录查询指南、SO 上的其他问题或在 Rails 控制台中乱来找到答案。

我只是想通过活动记录查询接口来查询数据库,并返回第一个或最后一个条目的单个列的值,而不必遍历整个表(稍后会解释)。

有一种方法可以使用 pluck 执行此操作,但是查询消息的结构如下:

    initial = Message.where("id = ?", some_id).pluck(:value).first
    final   = Message.where("id = ?", some_id).pluck(:value).last

不幸的是,这是一个非常低效的操作,因为它会value从每条与提供的匹配项匹配的记录中提取属性id,然后只返回第一个或最后一个条目。我想基本上将这些陈述重新排序为:

    initial = Message.where("id = ?", some_id).first.pluck(:value)
    final   = Message.where("id = ?", some_id).last.pluck(:value)

但是,我得到一个 NoMethodError 解释没有pluckMessage 的方法。我尝试过多种方式来做到这一点:

    initial = Message.where("id = ?", some_id).first(:value)
    initial = Message.where("id = ?", some_id).first.select(:value)
    ...

但都返回某种错误。我知道返回

哎呀
,我的问题的一部分被切断了(包括我最后得到的答案) - 我会看看我是否能找到它,但我使用该select()方法进行了探索,在该方法中我发现 select 只接受一个参数,意思是一个查询必须构建字符串,因为它不能接受像这样的可选参数id = ?, some_id,但后来我发现只需附加一个.valuevalue您要获取的列属性在哪里)就可以了,所以我切换回where如下答案所示的方法。

4

1 回答 1

2

答案在问题中,但是如果您尝试执行以下操作:

    initial = Message.where("id = ?", some_id).pluck(:value).first
    final   = Message.where("id = ?", some_id).pluck(:value).last

把它改成这个(只引用列名,在这个例子中它是value,但它可能是amount什么):

    initial = Message.where("id = ?", some_id).first.value
    final   = Message.where("id = ?", some_id).last.value
于 2013-02-14T18:12:11.857 回答