ruby-on-rails - 参数化 ActiveRecord #joins 方法

标签 ruby-on-rails activerecord

我正在重构一个相当复杂的查询,其中涉及将多个 .joins 方法链接在一起。在其中一个连接中,我使用原始 SQL 查询,该查询使用字符串插值,即连接 WHERE foo.id = #{id}。我知道我可以通过使用 ? 变量并将参数作为参数传递来参数化 ActiveRecord #where ,但 joins 方法不支持这种方式的多个参数。例如:

使用:

Post.my_scope_name.joins("LEFT JOIN posts ON posts.id = images.post_id and posts.id = ?", "1") 以便传入 id 1 生成一个 ActiveRecord::StatementInvalid

因为生成的 SQL 如下所示:

“LEFT JOIN posts ON posts.id = images.post_id and posts.id = ? 1”

使用 joins 方法时参数化查询的标准方法是什么?

最佳答案

arel “关系代数”是 Rails 的底层查询组装器,可用于构造 Rails 不高级支持的查询、条件、连接、CTE 等。由于这个库是 Rails 的一个组成部分,大多数 Rails 查询方法都支持直接注入(inject) Arel 对象,不会出现任何问题(说实话,大多数方法都会将您的参数转换为这些对象之一)。

根据您的情况,您可以按如下方式构建所需的联接:

  posts_table = Post.arel_table
  images_table = Image.arel_table 
  some_id = 1

  post_join = Arel::Nodes::OuterJoin.new(
    posts_table,
    Arel::Nodes::On.new(
      posts_table[:id].eq(images_table[:post_id])
        .and(posts_table[:id].eq(some_id))
    )
  )

生成的 SQL:

  post_join.to_sql
  #=> "LEFT OUTER JOIN [posts] ON [posts].[id] = [images].[post_id] AND [posts].[id] = 1"

然后您只需将此联接添加到当前查询

  Image.joins(post_join)
  #=> SELECT images.* FROM images LEFT OUTER JOIN [posts] ON [posts].[id] = [images].[post_id] AND [posts].[id] = 1

关于ruby-on-rails - 参数化 ActiveRecord #joins 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56872272/

相关文章:

ios - 将 swift 1.2 代码转换为 swift 2 : Missing argument label in call

ruby-on-rails - 尝试在Ruby on RailsError中显示显示管理员用户的索引

mysql - 恢复迁移时 ActiveRecord::IrreversibleMigration 异常

ruby-on-rails - 编写具有字符串条件数组的 ActiveRecord 查询

php - 在我的数据库中检索记录的逻辑? MySQL PHP

ruby-on-rails - 为什么Devise一直问我名字不能为空?

javascript - YUI 编辑器 : How to paste as plain text?

ruby-on-rails - 使用 ruby​​ 进行系统测试(可能是 rspec)

mysql - 优化sql查询删除行

ruby-on-rails - 新手:获取对象的属性值为#<ActiveRecord::Relation> 提供错误未定义的方法