2015-10-03 17 views
6

arasındaki ilişkiden seçilen sütunları içerir. Açıklamaya çalışacağım:Raylar, yalnızca

Tablo 'Ürünüm' ve 'Mağaza' tablom var. Sadece sayfada göstermek için mağaza adını almaya çalışıyorum, ancak ActiveRecord bana tüm sütunları mağazadan geri veriyor.

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

(Raylar itibaren) inşa sorgu: İşte

kodudur

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) 

Sadece ürünün mağaza adını göstermek istiyorum, ama Raylar tüm mağaza sütunları seçmektir.

Benim modeller:

Product.rb

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

Store.rb:

class Loja < ActiveRecord::Base 
    has_many :products 
end 

Herhangi ideia?

cevap

5

Sen koparmak ile bunu ve katılır yapabilirsiniz: Geri koparmak tanımlanan sütun sırasını izler dizisini almak için gidiyoruz

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

. I've written about pluck before if you're not familiar with it.


başka yolu düz bir SQL sorgusu yoluyladır:

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, ... }] 

Her iki seçenek sonuçları çıkıp nasıl sadece değişir, aynı SQL deyimi üretirler.

+0

Verdiğiniz SQL doğrudan AR kullanarak yazılabilir. –

+0

Ancak, pluck ile artık bir nesne olmayacak, değil mi? –

+0

@HerlonAguiar bu doğru, bir dizi değer döndürecek. Bu, pluck ve select'in dezavantajlarından biri. –

2

Projeme benzer bir şey denedim. Bu çalışması gerekir:

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

joins kullanma raylar yalnızca bir sorgu gerçekleştirmek yapacak includes aksine, joins dernek istekli-yük değil çünkü.

+0

Cevabınız için teşekkürler Ama zaten denedim, aynı zamanda yükleniyor Tüm mağaza sütunlarını yüklüyor –

+0

Ürünlerde (muhtemelen bir varsayılan kapsam veya bir sonradan sonradan) depoları yükleyen bir şey olmadığından emin misiniz? – TheSuper

+0

Evet, postayı modellerimle güncelledim, bir bak –