#sql #ruby-on-rails #ruby-on-rails-3 #left-join #outer-join
#sql #ruby-on-rails #ruby-on-rails-3 #левое соединение #outer-join
Вопрос:
По какой-то причине представление остается пустым, хотя в базе данных есть данные.В журнале отображается оператор sql, выбирающий таблицы, но я действительно не понимаю этого, кто-нибудь может мне помочь, что здесь происходит?Заранее спасибо
контроллер
@city = City.find(session[:city_id])
@store_deals=StoreDeal.where("stores.city_id = ?", session[:city_id]).includes(:deal, :store => [:city])
Вид
<% @store_deals.each do |store_deal| %>
<%= store_deal.deal.item_name %>
<%= store_deal.store.store_name %>
<%end%>
В журнале
SQL (0.3ms) SELECT "store_deals"."id" AS t0_r0, "store_deals"."store_id" AS t0_r1,
"store_deals"."deal_id" AS t0_r2, "store_deals"."created_at" AS t0_r3, "store_deals".
"updated_at" AS t0_r4, "store_deals"."store_name" AS t0_r5,
"store_deals". "address" AS t0_r6, "deals"."id" AS t1_r0, "deals"."size" AS t1_r1, "deals"."item_name" AS t1_r2,
"deals"."brand" AS t1_r3, "deals"."stars" AS t1_r4, "deals"."created_at" AS t1_r5, "deals"."updated_at" AS t1_r6, "deals"."city_id" AS t1_r7,
"deals"."category_id" AS t1_r8, "deals"."price" AS t1_r9, "stores"."id" AS t2_r0, "stores"."store_name" AS t2_r1, "stores"."created_at" AS t2_r2, "stores".
"updated_at" AS t2_r3, "stores"."address" AS t2_r4, "stores"."city_id" AS t2_r5, "cities"."id" AS t3_r0, "cities"."name" AS t3_r1, "cities".
"created_at" AS t3_r2, "cities"."updated_at" AS t3_r3 FROM "store_deals" LEFT OUTER JOIN "deals" ON "deals"."id" = "store_deals"."deal_id" LEFT
OUTER JOIN "stores" ON "stores"."id" = "store_deals"."store_id" LEFT OUTER JOIN "cities" ON "cities"."id" = "stores"."city_id" WHERE (stores.city_id = 2)
Модели
class City < ActiveRecord::Base
has_many :stores
has_many :deals
end
class Deal < ActiveRecord::Base
belongs_to :city
has_many :stores ,:through =>:store_deals
has_many :store_deals
end
class StoreDeal < ActiveRecord::Base
belongs_to :store
belongs_to :deal
end
Ответ №1:
Это запрос, который соответствует вашей @store_deals = StoreDeal.where ...
строке. При использовании includes
Rails использует псевдонимы столбцов (например AS t1_r5
), чтобы отслеживать, какие столбцы в результатах принадлежат какому объекту, когда он создает объекты из результатов.
Вероятно, ваше представление пустое, потому @store_deals
что оно пустое, т. Е. Запрос не вернул строк. Вы пробовали проверять его, чтобы увидеть, содержит ли он то, что вы ожидаете?
Комментарии:
1. Это было очень полезно. Как мне его проверить?
2. Вы можете либо записать его на консоль, например
Rails.logger.info @store_details.inspect
, или показать его в своем представлении, например<%= debug @store_details %>
.