如果Rails对象包含特定列中的特定值,则返回布尔值

时间:2017-12-04 20:29:27

标签: ruby-on-rails ruby activerecord

我正在尝试编写rails / activerecord查询,如果rails对象包含特定值,则返回true。我在'Users'和'Bicycles'之间有一个名为'Events'的连接表,Events表中有一个名为'event_type'的列。我试图找出一个特定的自行车上次创建的事件是否包含event_type'被盗'。我想只返回true或false,而不是rails对象本身。

我已经能够使用以下方式返回最后一个事件对象:

Bicycle.find(:id).events.last

如果任何事件通过以下方式注册到该自行车包含event_type'被盗',我可以返回true或false:

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

只有当对象上的最后一个事件包含event_type'被盗'时,我才能返回true?

谢谢!

1 个答案:

答案 0 :(得分: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"