nic*_*ans 4 sql postgresql ruby-on-rails arel
postgresql的执行,性能或逻辑之间是否存在显着差异
SELECT "users".* FROM "users" WHERE ("users"."deleted_at" IS NULL)
Run Code Online (Sandbox Code Playgroud)
和
SELECT "users".* FROM "users" WHERE (NOT ("users"."deleted_at" IS NOT NULL))
Run Code Online (Sandbox Code Playgroud)
显然,如果用手写,第一个表达式就是我要写的那个(谁会故意写一个双重否定?!).但在这种情况下,我使用ruby的arel库动态创建两个版本,有点像:
def generate_query(search_terms, negated=false, users=User)
where_clause = arel_for_one_of_many_possible_queries(search_terms)
where_clause = where_clause.not if negated
users.where(where_clause)
end
Run Code Online (Sandbox Code Playgroud)
并且,对于"deleted"search_term,where_clause将是arel_table[:deleted_at].not_eq(nil),但对于其他search_terms,它可以是各种子句,包括复合子句和子选择.添加.not到最后,arel将始终生成第二种形式的SQL.我可以通过特殊的套管我的NULL检查和手动生成.eq或.not_eq视情况生成第一个表单,但在我使代码更详细之前,我希望这样做有一些明显的好处.