在多个条件下有效地获取记录
Efficiently fetching records on multiple condition
使用 aasm
statemachine
模型 Booking
。
状态机有以下状态
state :payment_authorized
state :payment_captured
state :payment_failed
state :some_more_states
所以要根据状态获取预订,我可以调用 booking.payment_authorized
。但是我要寻找的是状态为 payment_authorized
和 payment_captured
的所有记录。
这有效 booking.payment_authorized + booking.payment_captured
但这是在进行 2 次数据库调用。一个用于查找 authorized_state
,另一个用于查找 captured_state
。我怎样才能更有效地做到这一点(一次通话)?
谢谢
您可以使用 Booking.payment_authorized.or(Booking.payment_captured)
在单个查询中获取所有记录。
@Tom 给出了很好的解决方法。它利用 ActiveRelation
的 OR
来实现两个关系的逻辑联合。请注意,该解决方案特定于 Rails 5.
您也可以通过以下方式完成:
Booking.where(aasm_state: [:payment_authorized, :payment_captured])
默认情况下,aasm
使用 aasm_state
列来包含状态。它将进行 IN
查询。
使用 aasm
statemachine
模型 Booking
。
状态机有以下状态
state :payment_authorized
state :payment_captured
state :payment_failed
state :some_more_states
所以要根据状态获取预订,我可以调用 booking.payment_authorized
。但是我要寻找的是状态为 payment_authorized
和 payment_captured
的所有记录。
这有效 booking.payment_authorized + booking.payment_captured
但这是在进行 2 次数据库调用。一个用于查找 authorized_state
,另一个用于查找 captured_state
。我怎样才能更有效地做到这一点(一次通话)?
谢谢
您可以使用 Booking.payment_authorized.or(Booking.payment_captured)
在单个查询中获取所有记录。
@Tom 给出了很好的解决方法。它利用 ActiveRelation
的 OR
来实现两个关系的逻辑联合。请注意,该解决方案特定于 Rails 5.
您也可以通过以下方式完成:
Booking.where(aasm_state: [:payment_authorized, :payment_captured])
默认情况下,aasm
使用 aasm_state
列来包含状态。它将进行 IN
查询。