как получить доступ к образцовым атрибутам соединения направляющих при использовании has_many: через

SELECT n.id
     , n.city
     , n.country
     , n.region
     , n.popular
     , n.rating
  FROM 
     ( SELECT a.*
            , CASE WHEN @prev = region THEN @i:=@i+1 ELSE @i:=1 END i
            , @prev:=region prev 
         FROM
            ( SELECT c.*
                   , n.rating
                FROM cities c 
                JOIN nightlife n 
                  ON n.cityid = c.id 
               ORDER 
                  BY region
                   , rating DESC
            ) a
         JOIN ( SELECT @prev:=null,@i:=0) vars
      ) n
  WHERE n.i <= 2;

  +------+-----------+---------+--------+---------+--------+
  | id   | city      | country | region | popular | rating |
  +------+-----------+---------+--------+---------+--------+
  |   23 | shanghai  | spain   | asia   |       1 |    9.5 |
  |   54 | tokyo     | japan   | asia   |       1 |    9.3 |
  |    1 | barcelona | spain   | europe |       1 |     10 |
  |    5 | paris     | france  | europe |       1 |      9 |
  +------+-----------+---------+--------+---------+--------+
5
задан Ian Vaughan 23 February 2015 в 21:24
поделиться

2 ответа

В Вашем примере Вы определили в отношениях модели Item как has_many для collection_items и наборов, сгенерированный метод ассоциации является collection_items и наборами соответственно, они оба возвращают массив так способ, которым Вы пытаетесь получить доступ, здесь является неправильным. это - прежде всего, случай mant многим отношения. просто проверьте эту Документацию Asscociation на дальнейшую ссылку.

3
ответ дан 14 December 2019 в 13:48
поделиться
do_something_with( item.collection_item_id )

Это перестало работать, потому что объект не имеет collection_item_id участника.

do_something_with( item.collection_item.collection_item_id )

Это перестало работать, потому что объект не имеет collection_item участника.

Помните, что отношение между объектом и collection_items является has_many. Таким образом, объект имеет collection_items, не только единственный объект. Кроме того, каждый набор имеет список объектов набора. То, что Вы хотите сделать, является, вероятно, этим:

colls = Collection.find :all
colls.each do |coll|
  coll.collection_items.each do |collection_item|
    do_something_with( collection_item.id )
  end
end

Несколько других советов:

  • Сделайте, чтобы Вы прочитали документацию для has_many: через в Руководствах направляющих? Это довольно хорошо.
  • Вам не должно быть нужно: исходные параметры в has_many объявлениях, так как Вы назвали свои модели и ассоциации разумным способом.

Я нашел из онлайн-документации, что использование has_and_belongs_to_many присоединит атрибуты объединяющей таблицы к полученным объектам, но по-видимому это удерживается от использования. Я еще не попробовал его.

Я рекомендую придерживаться has_many: через, потому что has_and_belongs_to_many более сбивает с толку и не предлагает реальной выгоды.

3
ответ дан 14 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: