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