ActiveRecord提供了一种简单的方法,使用ActiveRecord::QueryMethods#select 方法从表中选择特定字段。
最近ActiveRecord::QueryMethods#select增加了对哈希值的支持。
让我们来看看Product 和Variant 模型的一些例子
class Product < ApplicationRecord
# id, name, description
has_many :variants
end
class Variant < ApplicationRecord
# id, price, quantity, product_id
belongs_to :product
end
之前
在7.1之前,我们可以用下面的语法来选择特定的字段。
Product
.joins(:variants)
.select("products.id, products.name, variants.price")
# OR
Product
.joins(:variants)
.select(:id, :name, "variants.price")
以上的结果是:
SELECT products.id, products.name, variants.price
FROM "products"
INNER JOIN "variants" ON "variants"."product_id" = "products"."id"
LIMIT $1 [["LIMIT", 11]]
/* OR */
SELECT "products"."id", "products"."name", "variants"."price"
FROM "products"
INNER JOIN "variants" ON "variants"."product_id" = "products"."id"
LIMIT $1 [["LIMIT", 11]]
之后
在ActiveRecord::QueryMethods#select添加了对哈希的支持后,我们不需要再使用原始版本的查询。
让我们来看看这一变化后的相同代码。
Product
.joins(:variants)
.select(:id, :name, variants: [:price])
上面的结果将是:
SELECT "products"."id", "products"."name", "variants"."price"
FROM "products"
INNER JOIN "variants" ON "variants"."product_id" = "products"."id"
LIMIT $1 [["LIMIT", 11]]
我们也可以使用下面的语法,支持alias 。
Product
.joins(:variants)
.select(
products: { id: :product_id, name: :product_name },
variants: { price: :product_price }
)
上面的结果将是:
SELECT "products"."id" AS product_id, "products"."name" AS product_name, "variants"."price" AS product_price
FROM "products"
INNER JOIN "variants" ON "variants"."product_id" = "products"."id"
LIMIT $1 [["LIMIT", 11]]