2014-10-20 2 views
-1

У меня есть пользователь модель, с отдельным профиль модель. У каждого пользователя есть профиль. Затем у меня есть 8 моделей для вещей в профиле (например, каждый профиль имеет панель инструментов, отзывы и публикации). Профиль принадлежит пользователю, а панель приборов и т. Д. Принадлежит профилю.Rails 4 - кодирование через модели

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

Например, профиль будет отображаться с именем его владельца (который хранится в пользовательской модели). Он также будет иметь обратную связь, хранящуюся в модели обратной связи. Есть ли способ написать, что в представлении профиля должно отображаться user.first_name user.last_name и user.feedback?

ответ

2

Вы можете цепи звонки через профиль, как так:

@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 с помощью методов модели.

+0

спасибо. Я проверю это. Означает ли это, что вы можете иметь несколько разных декораторов, использующих одни и те же базовые модели? – Mel

+0

Да, абсолютно. Я рекомендую вам потратить час на чтение многочисленных мнений (и определений) декораторов, докладчиков, экспонентов, объектов просмотра, моделей просмотра и т. Д. В Ruby. Там много хорошего материала, и ничто из этого не является повсеместным. – coreyward

+0

Это хорошее место для начала - это говорит о многом больше, чем просто декораторы и виды. http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/ – coreyward

Смежные вопросы