我正在为一个项目创建一个修订系统,其中基表包含给定 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 中的连接,这似乎很愚蠢。这是一个错误,还是有更好/正确的方法来做到这一点?