Rails仅包含关系

时间:2015-10-03 17:45:13

标签: ruby-on-rails ruby activerecord

我会尝试解释:

我有一张桌子'产品'还有一张桌子' Store'。我试图获取要在页面上显示的商店名称,但ActiveRecord正在向我返回商店中的所有列。

以下是代码:

@product = Product
          .order(id: :desc)
          .includes(:store)
          .select("products.id, products.store_id, stores.name")
          .limit(1)

构建的查询(来自Rails):

Processing by IndexController#index as HTML
Product Load (0.0ms)  SELECT  products.id, products.store_id FROM `products`  ORDER BY `products`.`id` DESC LIMIT 1
Store Load (1.0ms)  SELECT `stores`.* FROM `stores` WHERE `stores`.`id` IN (111)

我只想显示产品的商店名称,但Rails正在选择所有商店列。

我的模特:

Product.rb

class Product < ActiveRecord::Base
  belongs_to :store, :foreign_key => 'store_id'
end

Store.rb:

class Loja < ActiveRecord::Base
  has_many :products
end

任何想法?

2 个答案:

答案 0 :(得分:5)

你可以通过采摘和加入来做到这一点:

Product
  .order(id: :desc)
  .joins(:store)
  .pluck("products.id, products.store_id, stores.name")
  .limit(1)

您将获得一个遵循pluck中定义的列顺序的数组。 I've written about pluck before if you're not familiar with it.

另一种方法是通过直接的SQL查询:

sql =<<-EOF
  SELECT products.id, products.store_id, stores.name
  FROM products INNER JOIN stores
    ON products.store_id = stores.id
  ORDER BY products.id DESC
  LIMIT 1
EOF
records = ActiveRecord::Base.connection.execute(sql)

#=> [{"id" => X, "store_id" => Y, "name" => Z, ... }]

两个选项都产生相同的SQL语句,结果如何变化。

答案 1 :(得分:2)

在我的项目中尝试过类似的东西。这应该有效:

@products = Product.
  .order(id: :desc)
  .joins(:store)
  .select("products.id, products.store_id, stores.name")
  .limit(1)

使用joins而不是includes会使rails只执行一个查询,因为joins不会急切加载关联。