【问题标题】:ActiveRecord Generate Condition SQLActiveRecord 生成条件 SQL
【发布时间】: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


    【解决方案1】:

    我也想知道如何在没有前导 WHERE 的情况下获得条件。我在https://coderwall.com/p/lsdnsw/chain-rails-scopes-with-or 中看到他们使用字符串操作来摆脱WHERE,这看起来很混乱,但可能是目前唯一的解决方案。 :/

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

    【讨论】:

      猜你喜欢
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多