Rails 3:范围不正确

时间:2011-10-12 02:46:12

标签: ruby-on-rails arel

如何将以下内容转换为适用于sqlite和mysql的内容?请注意,internal可以为空。

  scope :external, where("internal is not true")

(在Rails 4中,人们可以简单地使用:)

  scope :external, where.not(internal: true)

3 个答案:

答案 0 :(得分:4)

ActiveRecord非常聪明,只需这样做:

scope :external, where(internal: [false, nil])

这将在类似的SQL中转换(可能包含表名和quetes):

  • for PostgreSQL和SQLite internal IN ('f') OR internal IS NULL
  • for MySQL internal IN (0) OR internal IS NULL

如果需要更多控制权,可以使用Arel:

scope :external,
  where(arel_table[:internal].eq(false).or(arel_table[:internal].eq(nil)))

这将是:

  • for PostgreSQL和SQLite internal = 'f' OR internal IS NULL
  • for MySQL internal = 0 OR internal IS NULL

请记住,如果需要在SQL中检查NULL值,请始终使用IS NULLIS NOT NULL表达式。

对于所有内容,评分... <> NULL... = NULL... IN (NULL)被评估为false。

因此,NULL <> NULL为false,NUL = NULL为false。

答案 1 :(得分:1)

尝试范围:外部,其中('内部IN(?)',[false,nil])

答案 2 :(得分:-1)

尝试scope :external, where(:internal => !true)