我会尝试解释:
我有一张桌子'产品'还有一张桌子' 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
任何想法?
答案 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
不会急切加载关联。