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 |
+------+-----------+---------+--------+---------+--------+
В Вашем примере Вы определили в отношениях модели Item как has_many для collection_items и наборов, сгенерированный метод ассоциации является collection_items и наборами соответственно, они оба возвращают массив так способ, которым Вы пытаетесь получить доступ, здесь является неправильным. это - прежде всего, случай mant многим отношения. просто проверьте эту Документацию Asscociation на дальнейшую ссылку.
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_and_belongs_to_many присоединит атрибуты объединяющей таблицы к полученным объектам, но по-видимому это удерживается от использования. Я еще не попробовал его.
Я рекомендую придерживаться has_many: через, потому что has_and_belongs_to_many более сбивает с толку и не предлагает реальной выгоды.