我写一个函数的目标是允许呼叫者在他们将在ActiveRecord的一个where
调用相同的条件参数传递,我想对应的Rails的生成的SQL。
如果我的函数接收这样的哈希作为参数
role: 'Admin', id: [4, 8, 15]
我期望产生这个字符串
"users"."role" = 'Admin' AND "users"."id" IN (4, 8, 15)
我得到的最接近与to_sql
。
pry(main)> User.where(role: 'Admin', id: [4, 8, 15])
=> "SELECT \"users\".* FROM \"users\" WHERE \"users\".\"role\" = 'Admin' AND \"users\".\"id\" IN (4, 8, 15)"
它返回几乎正是我想要的;但是,我会更舒服未剥离掉SELECT ... WHERE
自己在什么情况下,在生成SQL方式的变化。我意识到应该在哪里总是有分裂,但我宁愿更不易碎的做法。
我的下一个方法是使用阿雷尔的where_sql
功能。
pry(main)> User.where(role: 'Admin', id: [4, 8, 15]).arel.where_sql
=> "WHERE \"users\".\"role\" = $1 AND \"users\".\"id\" IN (4, 8, 15)"
它摆脱了SELECT
的,但离开WHERE
。我会喜欢它上面的,如果它已经注入的消毒作用,但可使其颇有几分不太理想。
我也认为生成SQL自己,但我宁愿避免这种情况。
做任何你知道,如果有一些方法在我眼皮底下我只是还没有找到吗?或者是完全有这样做的更好的办法?
Ruby 2.3.7
Rails 5.1.4
我也想知道如何得到的条件没有前导WHERE
。我看到https://coderwall.com/p/lsdnsw/chain-rails-scopes-with-or,他们使用的字符串操作摆脱WHERE
,这似乎是杂乱的,但也许目前唯一的解决办法。 :/
scope.arel.where_sql.gsub(/\AWHERE /i, "")