рельсовые отношения, минимум 3 уровня - PullRequest
0 голосов
/ 11 октября 2011

Как я могу достоверно использовать отношения рельсов в моем случае?

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

Итак, photos в albums отлично работают, я использую там пользовательский код sql с соединениями. Но когда я нажимаю на place, я хочу увидеть информацию от place модели и список albums с образцом photo (сначала, например)

Теперь у меня есть следующее:

class Place < ActiveRecord::Base
  has_many :albums
end

class Album < ActiveRecord::Base
  has_many :photos
  has_one :place
end

class Photo < ActiveRecord::Base
  belongs_to :album
end

А вот как я получаю это в моем контроллере:

@place = Place.find( params[:id], :include => :albums )

и я получаю @ place.albums как объект с данными альбомов. Но я не могу t know how to dig even deeper to reach the фотографии model. And anywhay i can: включать =>: альбомы because i have no direct relations between место and альбом , but i have them in альбом> фотография`

Это сложный вопрос, но я не понимаю его полностью.

Спасибо за любую помощь, может быть, хорошая ссылка для чтения!

Ответы [ 2 ]

2 голосов
/ 11 октября 2011

Прежде всего, связь между Place и Album не правильная.То, как вы его настроили, похоже, что ни у кого не было бы постороннего ключа.Другими словами, это должно быть Album belongs_to :place, с place_id в таблице albums.

Во-вторых, чтобы получить первое фото для каждого альбома:

<% @place.albums.each do |album| %>
  Sample Photo: <%= image_tag(album.photos.first.url) %>
<% end %>

Если вы действительно хотите, вы можете получить первую фотографию из первого альбома в одной строке:

<%= image_tag(@place.albums.first.photos.first.url) %>

Первое замечание: это может привести к нулю ошибок, если вы не добавите в условные выражения,так что я на самом деле не рекомендую этот метод.Но если бы вы использовали его, я бы просто добавил метод к модели Place:

def first_photo
  albums.first.photos.first
end

И, на ваш взгляд:

<%= image_tag(@place.first_photo.url) %>

Вы захотите присоединиться к этомусоберите вместе, чтобы вы не выполняли слишком много запросов.Ответ Волшебника Огза охватывает это.

1 голос
/ 11 октября 2011

Существует синтаксис хэша для вложенных включений. Это также работает для объединений.

@place = Place.find( params[:id], :include => {:albums => :photos} )

Вот документация для этого http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html Загляните в рубрику «Стремительная загрузка ассоциаций»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...