2015-12-06 3 views
0

У меня есть приложение для рельсов. Я хотел бы отображать пользователя только в том случае, если профиль существует (профиль пользователя has_one). Согласно моим лучшим знаниям, поскольку у меня есть группа в моем index.html.erb, я не могу просто использовать <%, если user.profile%>, поэтому я хочу отфильтровать его в контроллере.рельсы запрос только, если существует вложенный ресурс

Как изменить запрос для извлечения только тех пользователей из db, у кого есть профиль?

В общем, как лучше всего проверить, существует ли вложенный ресурс? Выполнять это в контроллере с запросом или просто делать это в представлении?

пользователей/controller.rb

def index 
    @q_users = User.ransack(params[:q]) 
    @users = @q_users.result(distinct: true).includes(:profile).paginate(page: params[:page], per_page: 12) 
end 

index.html.erb

<div class="user-profile-index" style="padding-right:20px;padding-left:20px;"> 
    <% @users.each_slice(3) do |users_for_row| %> 
    <div class="row"> 
     <%= render :partial => "user", :collection => users_for_row, as: :user %> 
    </div> 
    <% end %> 
</div> 

_user.html.erb

<div class="col-md-4"> 
    <%= link_to user do %> 
    <div class="panel panel-info"> 
     <div class="panel-heading"> 
     </div> 
     <div class="panel-body"> 
     <% if user.profile %> 
     <% if user.profile.avatar %> 
      <%= image_tag user.profile.avatar.url(:base_thumb), class: "avatar" %> 
     <% end %> 
     <h4><%= user.profile.first_name %> <%= user.profile.last_name %></h4> 
     <h5><%= user.profile.company %></h5> 
     <% end %> 
     <h5><%= user.email %></h5> 
     </div> 
    </div> 
    <% end %> 
</div> 

user.rb

has_one :profile, dependent: :destroy 

profile.rb

belongs_to :user 
+0

Является ли 'профиль' полем на' user' или это отдельная модель? Можете ли вы показать соответствующий код модели? – Patrick

+0

Patrick, добавленные модели –

ответ

2

Заменить includes(:profile) с:

joins(:profile).preload(:profile) 

joins даст вам INNER JOIN, который будет выбирать только тех пользователей, которые имеют профили. preload будет предварительно загружать профили, которые найдены в joins (чтобы избежать проблемы с N + 1). Вы также можете переместить эти объединения в отдельную область в пользовательской модели, например. with_profile.

+1

Я считаю, что здесь '' здесь не нужно, так как условия будут генерироваться из вызова 'join'. 'joins (: profile) .preload (: profile)' должен работать. –

+0

@ WizardofOgz Да, вы правы. Благодарю. – Jeiwan

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