我正在尝试构建一个比较两个对象的查询,如果它们具有相同的 id,则不会获取记录。我有的是这个:

@channels.each do |channel|
  unless @guide_channels.where(:id => channel.id).exists?
    @dropdown_channels = @dropdown_channels.where(:id => channel.id)
  end
end

这会创建查询,但会在每个值之间放置一个 AND,这不是我所想的。我想要“或”运算符。是否有我可以使用的“orwhere”功能,或者是否有更好的方法来使用一些比较功能来做到这一点?

最佳答案

关键是 .where() 对象的 AR::Relation 方法将条件添加到一组条件中,然后在执行查询时将 AND 组合在一起。

您需要做的是像 NOT IN 这样的查询:

# select all the ids for related @guide_channels
# if @channels comes from a query (so it's a ActiveRecord::Relation):
guide_ids = @guide_channels.where(:id => @channels.pluck(:id)).pluck(:id)
#  use .where(:id => @channels.map {|c| c.id}) instead if @channels is just an array

# then use the list to exclude results from the following.
@dropdown_channels = @dropdown_channels.where("id NOT IN (?)", guide_ids.to_a)

第一个查询将累积在 @guide_channels 中有条目的 channel 的所有 ID。第二个将使用第一个的结果从下拉列表的结果中排除找到的 channel 。

关于ruby-on-rails - Rails 3.0 在每个循环中使用 "or"语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13158715/

10-12 17:16
查看更多