【问题标题】:Not understanding Arel usage ( Rails )不了解 Arel 的用法(Rails)
【发布时间】:2018-08-27 04:02:54
【问题描述】:

我一直在研究 Arel(主要是因为它在 ransack gem 中用于高级搜索)。我看过一些指南,但我不太明白它是如何工作的。

有例如

users = Arel::Table.new(:users)
users.where(users[:name].eq('amy'))
# => SELECT * FROM users WHERE users.name = 'amy'

这将产生一个 SQL 查询,但不执行它。 我怎样才能使用结果? Arel 应该如何编写&where(模型、视图、控制器?)

我知道它可能看起来有点宽泛,但我想看看在哪里/如何使用 arel 在我的表格中搜索。

【问题讨论】:

  • "这将产生一个 SQL 查询,但不会执行它" 如果您要在变量中捕获结果,例如users_named_amy = users.where(users[:name].eq('amy')) 那么您可以像处理任何其他 AR 查询一样对生成的 User 对象进行操作吗?

标签: ruby-on-rails ruby activerecord arel


【解决方案1】:

Arel 的一个用途是为您的模型构建条件。每当您进行这样的查询时,知道 Rails 本身在后台使用 Arel 也很有用:

User.where(name: 'amy')

Arel 相当于:

User.where(User.arel_table[:name].eq('amy'))

显然,对于此示例,不需要直接编写 Arel,但 Arel 允许在代码中组合更复杂的查询,而您通常需要在其中下降到手写 SQL 子句(例如使用其他运算符,如 IN>< 等)

例如,要查找超过 18 岁的用户:

User.where('age >= ?', 18)

可以写成

User.where(User.arel_table[:age].gteq(18))

您还可以使用 Arel 构建一个完整的 SQL 查询,然后将其传递给 Active Record 以执行它:

table = User.arel_table
sql = table.project(:id).where(table[:name].eq('amy')).to_sql # => "SELECT id FROM \"users\" WHERE \"users\".\"name\" = 'amy'"
ActiveRecord::Base.connection.execute(sql)

结果将是一个哈希数组,其中键是查询中选择的字段名称。

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    相关资源
    最近更新 更多