2011-12-08 102 views
1

当hidden_​​episodes_ids为空时,此查询不会返回任何记录。Rails 3查询 - IN(?)可以为空

:conditions => ["episodes.show_id in (?) AND air_date >= ? AND air_date <= ? AND episodes.id NOT IN (?)", @show_ids, @start_day, @end_day, hidden_episodes_ids] 

如果它是空的,SQL会像NOT IN (null)

所以我的解决办法是:

if hidden_episodes_ids.any? 
    *mode code*:conditions => ["episodes.show_id in (?) AND air_date >= ? AND air_date <= ? AND episodes.id NOT IN (?)", @show_ids, @start_day, @end_day, hidden_episodes_ids] 
else 
    *mode code*:conditions => ["episodes.show_id in (?) AND air_date >= ? AND air_date <= ?", @show_ids, @start_day, @end_day] 
end 

但比较难看(我真正的查询实际上是5线,连接和选择等..)

有没有办法使用单个查询,并避免NOT IN (null)

PS:这是迁移到Rails 3岁的查询,因此:conditions

回答

4

你应该只使用where方法,而不是作为将帮助清理所有的这件事。您只需将它们链接在一起:

scope = Thing.where(:episodes => { :show_id => @show_ids }) 
scope = scope.where('air_date BETWEEN ? AND ?', @start_day, @end_day) 

if (hidden_episode_ids.any?) 
    scope = scope.where('episodes.id NOT IN (?)', hidden_episode_ids) 
end 

能够有条件地修改范围避免了大量的重复。

+0

伟大的:D我必须开始浏览我所有的控制器和模型,并重写所有查询:) – Frexuz