【发布时间】:2018-07-18 21:56:32
【问题描述】:
我编写函数的目标是允许调用者将相同的条件参数传递给 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)"
它返回的几乎正是我想要的;但是,如果 SQL 的生成方式发生变化,我会更自在地不剥离 SELECT ... WHERE。我意识到 WHERE 应该总是在那里进行拆分,但我更喜欢一种不那么脆弱的方法。
我的下一个方法是使用 Arel 的 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。如果它已经注入了 sanitized 角色,我会更喜欢它,但这使得它不太理想。
我也考虑过自己生成 SQL,但我宁愿避免这样做。
你们有谁知道我眼皮底下有没有我还没找到的方法吗?还是有更好的方法来做到这一点?
Ruby 2.3.7
Rails 5.1.4
【问题讨论】:
标签: ruby-on-rails-5 arel