我希望有一个简单的解决方案,不涉及find_by_sql,如果没有,那么我想这将不得不工作。
我发现这篇文章引用了这个:
Topic.find(:all, :conditions => { :forum_id => @forums.map(&:id) })
哪个是一样的
SELECT * FROM topics WHERE forum_id IN (<@forum ids>)
我想知道是否有一种方法可以不这样做,比如:
SELECT * FROM topics WHERE forum_id NOT IN (<@forum ids>)
你可以尝试这样做:
Topic.find(:all, :conditions => ['forum_id not in (?)', @forums.map(&:id)])
你可能需要执行@forums.map(&:id).join(',')。如果参数是可枚举的,我不记得Rails是否会将参数放入CSV列表。
你也可以这样做:
# in topic.rb
named_scope :not_in_forums, lambda { |forums| { :conditions => ['forum_id not in (?)', forums.select(&:id).join(',')] }
# in your controller
Topic.not_in_forums(@forums)
你可以尝试这样做:
Topic.find(:all, :conditions => ['forum_id not in (?)', @forums.map(&:id)])
你可能需要执行@forums.map(&:id).join(',')。如果参数是可枚举的,我不记得Rails是否会将参数放入CSV列表。
你也可以这样做:
# in topic.rb
named_scope :not_in_forums, lambda { |forums| { :conditions => ['forum_id not in (?)', forums.select(&:id).join(',')] }
# in your controller
Topic.not_in_forums(@forums)
你可能想看看Ernie Miller的meta_where插件。你的SQL语句:
SELECT * FROM topics WHERE forum_id NOT IN (<@forum ids>)
...可以这样表示:
Topic.where(:forum_id.nin => @forum_ids)
Railscasts的Ryan Bates制作了一个很好的视频来解释MetaWhere。
不确定这是否是你想要的,但在我看来,它肯定比嵌入式SQL查询更好。
导轨 4+:
Article.where.not(title: ['Rails 3', 'Rails 5'])
Rails 3:
Topic.where('id NOT IN (?)', Array.wrap(actions))
其中actions是一个数组,包含:[1,2,3,4,5]