Rails - 与 ActiveRecord 的深度嵌套连接
Rails - deeply nested joins with ActiveRecord
我偶尔需要在我的应用程序中执行跨多个表的联接,但还没有完全弄清楚如何对超过 3 个表执行此操作:
class Store < ApplicationRecord
has_many :products
end
class Product < ApplicationRecord
belongs_to :store
has_many :product_variants
end
class ProductVariant < ApplicationRecord
belongs_to :product
has_many :order_list_items
end
class OrderListItem < ApplicationRecord
belongs_to :product_variant
has_many :consumers
end
class Consumer < ApplicationRecord
belongs_to :order_list_item
end
目前我已准备就绪:
Store.joins(products: [{ product_variants: :order_list_items }])
我现在想做的是加入属于 OrderListItem 的每个消费者。
但是,当我尝试以下操作时:
Store.joins(products: [{ product_variants: :order_list_items }], order_list_items: [:consumers])
我收到错误:
(Object doesn't support #inspect)
以下两次尝试同样的错误:
Store.joins(products: [{ product_variants: :order_list_items }, order_list_items: [:consumers]])
Store.joins(products: [{ product_variants: :order_list_items }], order_list_items: [:consumers])
我已正确设置关联,order_list_item.consumers
和 consumer.order_list_items
和 order_list_item.product_variant
以及 product_variant.order_list_items
工作正常。
我也没有在任何模型上覆盖 initialize
。
工作 SQL 看起来像这样:
SELECT stores.id, products.id as product_id, product_variants.id as product_variant_id, order_list_items.id as list_item_id, consumers.id as consumer_id
FROM stores
INNER JOIN products ON products.store_id = stores.id
INNER JOIN product_variants on product_variants.product_id = products.id
INNER JOIN order_list_items on order_list_items.product_variant_id = product_variants.id
INNER JOIN consumers on consumers.order_list_item_id = order_list_items.id;
感谢任何提示。
试试这个
Store.joins(products: [product_variants: [order_list_items: :consumers]])
下面是sql查询
SELECT "stores".* FROM "stores"
INNER JOIN "products"
ON "products"."store_id" = "stores"."id"
INNER JOIN "product_variants"
ON "product_variants"."product_id" = "products"."id"
INNER JOIN "order_list_items"
ON "order_list_items"."product_variant_id" = "product_variants"."id"
INNER JOIN "consumers"
ON "consumers"."order_list_item_id" = "order_list_items"."id";
我偶尔需要在我的应用程序中执行跨多个表的联接,但还没有完全弄清楚如何对超过 3 个表执行此操作:
class Store < ApplicationRecord
has_many :products
end
class Product < ApplicationRecord
belongs_to :store
has_many :product_variants
end
class ProductVariant < ApplicationRecord
belongs_to :product
has_many :order_list_items
end
class OrderListItem < ApplicationRecord
belongs_to :product_variant
has_many :consumers
end
class Consumer < ApplicationRecord
belongs_to :order_list_item
end
目前我已准备就绪:
Store.joins(products: [{ product_variants: :order_list_items }])
我现在想做的是加入属于 OrderListItem 的每个消费者。
但是,当我尝试以下操作时:
Store.joins(products: [{ product_variants: :order_list_items }], order_list_items: [:consumers])
我收到错误:
(Object doesn't support #inspect)
以下两次尝试同样的错误:
Store.joins(products: [{ product_variants: :order_list_items }, order_list_items: [:consumers]])
Store.joins(products: [{ product_variants: :order_list_items }], order_list_items: [:consumers])
我已正确设置关联,order_list_item.consumers
和 consumer.order_list_items
和 order_list_item.product_variant
以及 product_variant.order_list_items
工作正常。
我也没有在任何模型上覆盖 initialize
。
工作 SQL 看起来像这样:
SELECT stores.id, products.id as product_id, product_variants.id as product_variant_id, order_list_items.id as list_item_id, consumers.id as consumer_id
FROM stores
INNER JOIN products ON products.store_id = stores.id
INNER JOIN product_variants on product_variants.product_id = products.id
INNER JOIN order_list_items on order_list_items.product_variant_id = product_variants.id
INNER JOIN consumers on consumers.order_list_item_id = order_list_items.id;
感谢任何提示。
试试这个
Store.joins(products: [product_variants: [order_list_items: :consumers]])
下面是sql查询
SELECT "stores".* FROM "stores"
INNER JOIN "products"
ON "products"."store_id" = "stores"."id"
INNER JOIN "product_variants"
ON "product_variants"."product_id" = "products"."id"
INNER JOIN "order_list_items"
ON "order_list_items"."product_variant_id" = "product_variants"."id"
INNER JOIN "consumers"
ON "consumers"."order_list_item_id" = "order_list_items"."id";