【问题标题】:Generating complex single SQL query with Rails Arel from chunks使用 Rails Arel 从块生成复杂的单个 SQL 查询
【发布时间】:2020-05-13 14:48:47
【问题描述】:

当发现 Arel 的东西不可链接时,我真的很惊讶使用 Arel 构建单个复合 sql 查询。

经过长时间的谷歌搜索,我找到了单一的解决方案。它使用'reflect'自定义方法,想法是递归实例化新的构建器类..不管。

例如,我是如何尝试的:

e = Arel::Table.new(:events)
a = e.where(e[:id].eq(1))

if (smth)  { a.where(e[:name].eq('joe')) } # not works

不可能以某种方式将其链接在一起。我的计划支离破碎。好吧,我已经手动实施了。

但是,这不是一个好主意,因为我应该防止任何 sql-injections 陷阱等。

【问题讨论】:

    标签: ruby-on-rails activerecord arel


    【解决方案1】:
    e.where(e[:id].eq(1).and(e[:name].eq('joe'))
    

    我真的不明白您为什么要使用 Arel,因为这是使用 ActiveRecord 查询界面的一项微不足道的任务:

    Event.where(id: 1, name: 'joe')
    # calls to merge are additive 
    Event.where(id: 1).where(name: 'joe')
    # you can also programmatically merge scopes together
    Event.where(id: 1).merge(Event.where(name: 'joe')) 
    

    【讨论】:

    • 因为我没有模型,所以我使用远程MySQL连接来获取一些数据,它是一个外国数据库服务器。我同意,也许 Arel 不是这项任务的关键。但我找不到任何替代方案。它应该是安全的,可以防止任何 SQL 注入等
    • 我看到你的例子带有 arel 链表达式,但我的链接是在不同的条件下相关的,例如:如果我的请求参数不包含这样的过滤器属性,则不应附加 e[:name ]跨度>
    • 我真的只想创建模型——如果你尝试在没有 M 的情况下进行 MVC,你不会为自己节省任何工作,而且很可能会弄得一团糟。是的,如果你有的话,你仍然可以使用 ActiveRecord现有的遗留数据库。
    • 不,基本上我不需要任何 MVC。我想,使用最旧的善意字符串连接通过 sql 生成来解决这个任务会很快..:/
    • 这是一个糟糕的结论 - 但我猜你的船是什么。
    猜你喜欢
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多