ruby-on-rails - rails 4 : Joins in ActiveRecord relation lambdas not include when doing a join

标签 ruby-on-rails ruby activerecord ruby-on-rails-4

我正在为一个项目创建修订系统,其中基表包含给定 id 的当前修订,修订表包含用给定修订标记的数据,例如:

foos
  - id
  - revision

foo_revisions
  - foo_id
  - revision
  {data}

对于这些之间的关系,我使用了 lamda 语法来指定关系的条件,如下所示:

class Article
   belongs_to :product, ->{ joins(:base).where("products.revision = product_revisions.revision") }, :class_name=> "Product::Revision", :primary_key => :product_id

文章未修订,但产品修订(Product::Revision 是包含实际数据的模型,是映射到 product_revisions 的 ActiveRecord::Base,而 Product 映射到产品)。

:base 关系是从 Product::Revision 到 Product

这适用于普通的事情,比如

a = Article.find(..)
a.product

哪些产品的sql(仅限a.product)

SELECT `product_revisions`.* FROM `product_revisions`
   INNER JOIN `products` ON `products`.`id` = `product_revisions`.`product_id`
   WHERE `product_revisions`.`product_id` = 406
   AND (products.revision = product_revisions.revision) ORDER BY `product_revisions`.`id` ASC LIMIT 1

但是当我执行 Article.joins(:product) 时它失败了,因为它没有加入产品表:

SELECT `articles`.* FROM `articles` INNER JOIN `product_revisions`
    ON `product_revisions`.`product_id` = `articles`.`product_id`
    AND (products.revision = product_revisions.revision)

错误:

Mysql2::Error: Unknown column 'products.revision' in 'on clause'

对我来说,ActiveRecord 在执行连接查询时似乎只是简单地忽略了 lamba 中的连接,这看起来很愚蠢。这是一个错误,还是有更好/正确的方法来做到这一点?

最佳答案

我遇到过类似的问题。在 lambda 中为 has_many 指定的任何连接都将被静默忽略。

我在为我解决问题的 Rails 问题中找到了这个: https://github.com/rails/rails/pull/11518

作者提到了当有 order 子句时出现的问题,但我认为这混淆了水 - 是否有 order 子句没有区别。

我不能说这是错误还是有意为之,但我怀疑是前者。

关于ruby-on-rails - rails 4 : Joins in ActiveRecord relation lambdas not include when doing a join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17702261/

相关文章:

ruby-on-rails - 如何在任何异常情况下使用 RSpec 的 should_raise?

ruby - 如何找出字符串拆分位置的索引?

ruby-on-rails - 使用 RSpec stub ActiveRecord 动态查找器

ruby-on-rails - 如何在 Controller 中使用带有 searchkick 的范围?

ruby-on-rails - Ruby on Rails - 每月最高票数

ruby-on-rails - send_file 只是发送一个空文件

ruby-on-rails - 错误 - 未初始化的常量 Project::Ticket

ruby-on-rails - NoMethodError 在我的一个模型中 #show actions

php - Yii2查询结果总是返回相同的

mysql - 将 SQL 转换为 ActiveRecord 查询