Вы можете цепи звонки через профиль, как так:
@profile.user.first_name
Но это нарушает принцип, известный как «Закон о Деметре». Существует сложное определение, но достаточно сказать, что когда вы обращаетесь к одному объекту (User
) через другой (Profile
), вы начинаете нарушать этот закон. Это не большое дело, когда вы обращаетесь свойства пользователя через профиль, обязательно, но вещи запутаться быстро:
@dashboard.profile.feedback.order(:rating).where(user: @dashboard.profile.user)
Гросса. И хрупкий. Когда вам нужно составить несколько моделей в одном представлении, есть лучший шаблон, известный как Decorator. Задача декоратора - предоставить вам один объект, который соответствующим образом собирает данные из моделей для презентации, не привязывая ваш код вида непосредственно к вашим моделям. Например:
class DashboardDecorator
def initialize(dashboard, profile, user)
@dashboard = dashboard
@profile = profile
@user = user
end
def full_name
"#{@user.first_name} #{@user.last_name}"
end
def feedback_count
@profile.feedback.count
end
def days_since_last_post
Date.today - @dashboard.last_login
end
end
# /app/controllers/dashboard_controller.rb
def show
# ...
@dashboard = DashboardDecorator.new(dashboard, profile, current_user)
end
Тогда ваш взгляд может получить доступ к данным через декоратор:
<%= @dashboard.full_name %>
В то время как вы можете написать свои собственные декораторы, как выше, все становится довольно утомительным довольно быстро. Если вам нравится автоматизировать некоторые из этих частей, вы должны проверить Draper, удобный камень, который упрощает создание декораторов, особенно когда ваши методы декоратора отображают 1: 1 с помощью методов модели.
спасибо. Я проверю это. Означает ли это, что вы можете иметь несколько разных декораторов, использующих одни и те же базовые модели? – Mel
Да, абсолютно. Я рекомендую вам потратить час на чтение многочисленных мнений (и определений) декораторов, докладчиков, экспонентов, объектов просмотра, моделей просмотра и т. Д. В Ruby. Там много хорошего материала, и ничто из этого не является повсеместным. – coreyward
Это хорошее место для начала - это говорит о многом больше, чем просто декораторы и виды. http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/ – coreyward