【问题标题】:Return Boolean if Rails Object Contains Specific Value in a Specific Column如果 Rails 对象在特定列中包含特定值,则返回布尔值
【发布时间】:2017-12-04 20:29:26
【问题描述】:

我正在尝试编写一个 rails/activerecord 查询,如果 rails 对象包含特定值,则该查询返回 true。我在“用户”和“自行车”之间有一个名为“事件”的连接表,事件表有一个名为“事件类型”的列。我试图找出特定自行车的最后创建事件是否包含 event_type 'stolen'。我只想返回 true 或 false,而不是 rails 对象本身。

我已经能够毫无问题地返回最后一个事件对象:

Bicycle.find(:id).events.last

如果有 any 事件注册到包含 event_type 'stolen' 的自行车,我可以返回 true 或 false,方法是:

Bicycle.find(:id).events.where("event_type='stolen'").count.positive?

如果对象上的最后一个事件包含 event_type 'stolen',我如何才能返回 true?

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    你会因为答案是多么明显而大笑……

    Bicycle.find(id).events.last.event_type == "stolen"
    

    但是,需要考虑的一个较小的边缘情况是:如果bicycle 没有没有事件怎么办?

    在这种情况下,Bicycle.find(id).events 将返回一个空集合,因此 Bicycle.find(id).events.last == nil。这意味着上面的代码会引发异常:NoMethodError: Undefined method event_type for nil:NilClass

    但是,一个简单的解决方法是使用safe navigation operator

    Bicycle.find(id).events.last&.event_type == "stolen"
    

    【讨论】:

    • 另一个小问题:你说你想要“last created 事件”,但是 - 假设你没有做一些不寻常的事情,比如更改 default_scope - 你的 .last代码实际上将返回具有最高idEvent。这将可能是同一件事,但不一定。为了保证您获取到最后一个created_at 事件,您需要order(:created_at)。如有疑问,请检查通过查看 rails 日志生成的 SQL!
    猜你喜欢
    • 2019-04-29
    • 2021-02-13
    • 2020-05-08
    • 2023-03-13
    • 1970-01-01
    • 2020-11-13
    • 2017-10-10
    • 2016-02-12
    • 2021-03-23
    相关资源
    最近更新 更多