ActiveRecord的生成条件SQL

问题描述 投票:1回答:1

我写一个函数的目标是允许呼叫者在他们将在ActiveRecord的一个where调用相同的条件参数传递,我想对应的Rails的生成的SQL。

Example

如果我的函数接收这样的哈希作为参数

role: 'Admin', id: [4, 8, 15]

我期望产生这个字符串

"users"."role" = 'Admin' AND "users"."id" IN (4, 8, 15)

Possible Solutions

我得到的最接近与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
ruby-on-rails-5 arel
1个回答
0
投票

我也想知道如何得到的条件没有前导WHERE。我看到https://coderwall.com/p/lsdnsw/chain-rails-scopes-with-or,他们使用的字符串操作摆脱WHERE,这似乎是杂乱的,但也许目前唯一的解决办法。 :/

scope.arel.where_sql.gsub(/\AWHERE /i, "")

© www.soinside.com 2019 - 2024. All rights reserved.