2

我正在为一个项目创建一个修订系统,其中基表包含给定 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

其中 article 没有修订,但 product 是(Product::Revision 是包含实际数据的模型,并且是 ActiveRecord::Base 映射到 product_revisions,而 Product 映射到 products)。

: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) 它失败了,因为它没有加入 products 表:

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 中的连接,这似乎很愚蠢。这是一个错误,还是有更好/正确的方法来做到这一点?

4

1 回答 1

0

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

我在为我解决问题的 Rails 问题中发现了这一点: https ://github.com/rails/rails/pull/11518

作者提到了有订单条款时会出现的问题,但我认为这会使水变得混乱-是否有订单条款没有区别。

我不能说这是一个错误还是预期的行为,但我怀疑是前者。

于 2013-11-01T16:13:08.060 回答