了解ActiveRecord::QueryMethods#select在Rails 7.1中增加了对哈希值的支持

71 阅读1分钟

ActiveRecord提供了一种简单的方法,使用ActiveRecord::QueryMethods#select 方法从表中选择特定字段。

最近ActiveRecord::QueryMethods#select增加了对哈希值的支持

让我们来看看ProductVariant 模型的一些例子

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]]