我正在尝试编写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?
谢谢!
答案 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"