我有一个Rails 3范围,它排除了一系列ID。
写入作用域的最佳方法是什么,以便在数组为空且仍可链接时它不执行任何操作?我目前有这个,它有效,但看起来有点不错:
scope :excluding_ids,
lambda {|ids| ids.empty? ? relation : where('id not in (?)', ids) }
如果我没有“ids.empty ??关系:”位,当ids为空时,生成的SQL是
... ID not in (NULL) ...
总是不会返回任何内容。如下所示:
Model.excluding_ids([]).where('id > 0')
不会返回任何结果。
答案 0 :(得分:19)
如果ids
数组为空,则不返回任何内容。
scope :excluding_ids, lambda { |ids|
where(['id NOT IN (?)', ids]) if ids.any?
}
如果没有ids
,则查询将在没有任何其他约束的情况下运行。
答案 1 :(得分:7)
在Rails 4中,您可以使用:
scope :excluding_ids, ->(ids) { where.not(id: ids) }
答案 2 :(得分:3)
道格拉斯的回答略有不同,使用ruby 1.9 stabby lambda语法,而where方法中没有括号。
scope :excluding_ids, ->(ids) {where("id NOT IN (?)", ids) if ids.any?}
答案 3 :(得分:0)
以下怎么样? (尽管如此,它仍会检查一个空数组,所以如果这是你试图避免的,那就没有太大改进了。)
scope :excluding_ids,
lambda {|ids| (ids.empty? && relation) || where('id not in (?)', ids) }