【发布时间】:2019-07-03 23:28:38
【问题描述】:
我正在重构一个相当复杂的查询,该查询涉及将多个 .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") 以传递 1 的 id 会产生 ActiveRecord::StatementInvalid
因为生成的 SQL 看起来像这样:
"LEFT JOIN posts ON posts.id = images.post_id and posts.id = ? 1"
使用joins 方法时参数化查询的标准方法是什么?
【问题讨论】:
-
joins确实支持多个参数。 guides.rubyonrails.org/… -
你能不能用类似时尚的代码来展示你正在尝试做的事情,而不是仅仅用文字来解释它?您可以使用
Arel::Nodes::InnerJoin或Arel::Nodes::OuterJoin构建这些类型的连接,但如果没有上下文,我宁愿不直接回答 -
@engineersmnky 我用一个例子更新了帖子
-
@Glyoko 虽然它确实支持多个参数,但它自然不支持多个连接条件,例如"posts.id = images.post_id AND posts.id = 1"
-
posts.id = 1不应该通过连接来完成。为此,您应该使用where(id: 1)和joins。例如Post.some_other_scope.joins(:images).where(id: 1)
标签: ruby-on-rails activerecord