11

以下があるとしましょう:

irb> Post.where(:hidden => true).to_sql
=> "SELECT `posts`.* FROM `posts` WHERE posts.hidden = 1"

どうにかして逆 SQL クエリを取得できますか?

私が探しているものは、おそらく次のようになります。

irb> Post.where(:hidden => true).invert.to_sql
=> "SELECT `posts`.* FROM `posts` WHERE NOT (posts.hidden = 1)"
4

6 に答える 6

17

別の構文で、はい。例:

posts = Post.scoped.table # or Arel::Table.new("posts")
posts.where(posts[:hidden].eq(true).not).to_sql
# => SELECT  FROM `posts` WHERE NOT ((`posts`.`hidden` = 1))
于 2011-03-14T19:29:53.290 に答える
7

Rails 4 にはnot、この目的のためのサフィックスがあります。

Post.where.not(hidden: true).to_sql
# => SELECT FROM `posts` WHERE `posts`.`hidden` != 1

Rails 3 ではsqueel gemを使用できます。多くの便利な機能を提供します。そしてそれであなたは書くことができます:

Post.where{ hidden != true }.to_sql
# => SELECT FROM `posts` WHERE `posts`.`hidden` != 1
于 2013-02-21T09:02:35.917 に答える
5

反転したクエリを ActiveRecord に戻すことで、Zabba の回答をさらに進めることができます。

table = Post.arel_table
query = table[:hidden].eq(true).not # the inverted query, still ARel
Post.where(query) # plug it back into ActiveRecord

通常予想されるように、これは ActiveRecord オブジェクトを返します。

于 2011-08-12T18:59:28.053 に答える
0

「真でない」条件 (例えば、偽または nil) を持つレコードを探しているときに私がすることは次のとおりです。

Post.where(["(hidden IS NULL) OR (hidden = ?)", false])
于 2012-09-11T06:38:18.323 に答える