我有一个Reservation
模型,我正在搜索三个字段。 container_id
必须始终为self.id
,但confirmed
和auto_confirmed
只需要一个为真。我有以下但是它没有执行我需要的东西:
Reservation.find(:all,
:conditions => ['container_id = ? AND confirmed = ? OR auto_confirm = ?',
self.id, true, true,])
我该如何更改?
答案 0 :(得分:6)
我不确定我是否遇到了问题,但据我所知,这会有用:
Reservation.find(:all,
:conditions => ['container_id = ? AND (confirmed = ? OR auto_confirm = ?)',
self.id, true, true,])
答案 1 :(得分:3)
根据您的问题确认并且auto_confirmed只需要一个为真。所以使用以下
Reservation.find(:all,
:conditions => ['container_id = :container AND
( (confirmed = :flag and auto_confirm != :flag) ||
(confirmed != :flag and auto_confirm = :flag))',
{:container=> self.id, :flag=>true}]
)
答案 2 :(得分:0)
我认为是这样的:
Reservation.find(:all,
:conditions => ['container_id = ? AND ((confirmed != true AND auto_confirm = true) OR (confirmed = true AND auto_confirm != true))',
self.id])
答案 3 :(得分:0)
我不确定这是否与数据库无关,但您可以尝试
Reservation.find(:all,
:conditions => ['container_id = ? AND confirmed = ? **XOR** auto_confirm = ?',
self.id, true, true,])
答案 4 :(得分:0)
你所说的不是真的 - 像
这样的查询 SELECT * FROM foos WHERE content_id = 345 AND (confirm = 1 OR auto_confirm = 1)
将选择两个“confirm”列都设置为1的行(ActiveRecord为布尔值创建tinyint列并对1和0进行检查)。
如果你的意思是“找到在content_id上匹配的所有行并且已经确认了或者auto_confirmed为真但不是两者都是”那么你会得到这样的查询
SELECT * FROM foos WHERE content_id = 345 AND ((confirmed = 1 AND auto_confirm = 0) OR (confirmed = 0 AND auto_confirm = 1))
你用这样的AR术语重写
Reservation.find(:all,
:conditions => [
'container_id = ? AND ((confirmed = 1 AND auto_confirm != 1) OR (confirmed = 0 AND auto_confirm != 1))',
self]
)
但是,从您的字段名称判断,您实际上是在实现一个具有单独列的状态机,这会给您带来痛苦,所以我会研究一些可以提供状态进展的东西,而不是检查单独的on和off位