Rails 5 много ко многим - PullRequest
       33

Rails 5 много ко многим

0 голосов
/ 12 января 2019

У меня проблема с глазами при представлении данных.

У меня есть 3 пользовательских модели, спонсоры и домашние животные. Результат, который спонсирует в таблице, объединяет пользователей и домашних животных, которые являются нэн, моя проблема в том, чтобы показать всех спонсоров талисмана в поле зрения и достижении, но в неправильном пути. Чтобы успеть осмотреть данные. Я надеюсь, что вы можете сказать мне, как это исправить. Спасибо.

index.html.erb

<h1>Sponsors#index</h1>

 <table class="table table-bordered table-hover table-striped" id="histories">
     <thead>
       <tr>
        <th>Mascota</th>
        <th>Padrinos</th>
        <th>Apadrinar</th>
      </tr>
    </thead>
    <tbody> 
     <% @pets.each do |pet| %>
         <tr>
             <td><%= pet.name %></td>
             <td>
                 <% @users.each do |user| %>
                     <% @sponsors.each do |sponsor| %>
                         <% if user.id == sponsor.user_id and pet.id == sponsor.pet_id %>
                             <%= user.email%>
                         <% else %>
                             <p>No Tengo Padinos =-( </p>
                         <% end %>
                     <% end %>
                 <% end %>
              </td>
              <td><button>Apadrinar</button></td>
         </tr>
      <% end %>
     </tbody>
 </table>  

У моего контроллера есть три модели, которые я отправляю для просмотра.

def index
 @sponsors = Sponsor.all
 @users = User.all
 @pets = Pet.all
end

pet.rb

class Pet < ApplicationRecord
 has_many :adoptions
 belongs_to :race, required: false
 has_many :users, through: :sponsors
end

user.rb

class User < ApplicationRecord
 has_many :pets, through: :sponsors
end

sponsor.rb

class Sponsor < ApplicationRecord
  belongs_to :user
  belongs_to :pet
end

Вывод, который теперь показывает мне вложение на изображении. введите описание изображения здесь

Мне также интересно, есть ли лучший способ сделать запрос, чтобы показать соответствующие данные.

Другое дело, как мне сделать так, чтобы я больше не мог спонсировать домашних животных, которых я уже дал спонсору?

Ответы [ 2 ]

0 голосов
/ 14 января 2019

После работы и следующих рекомендаций здесь мое решение.

<% @pets.each do |pet| %>
 <tr>
  <td><a href="<%= pet_path(pet) %>"> <%= pet.name %></a></td>
  <td>
    <% if pet.sponsors.any? %>
     <% pet.sponsors.each do |sponsor| %>
      | <%= sponsor.user_email %> |
     <% end %>
    <% else %>
     <p>No Tengo Padinos =-( </p>
    <% end %>
   </td>
   <td>
    <%= link_to "Apadrinar", {:controller => "sponsors", :action => "new", :mascot => pet.id }%>
   </td>
 </tr>
<% end %>

Я также изменил свои модели.

sponsor.rb

class Sponsor < ApplicationRecord
 belongs_to :user
 belongs_to :pet
 has_many :gifts
 delegate :email, to: :user, prefix: true, allow_nil: true
end

user.rb

class User < ApplicationRecord
 has_many :sponsors
 has_many :pets, through: :sponsors
end

pet.rb

class Pet < ApplicationRecord
 has_many :sponsors
 has_many :users, through: :sponsors
end

И, наконец, индекс mi на контроллере.

sponsors_controller.rb

def index
 # @sponsors = Sponsor.all
 # @users = User.all
 # @pets = Pet.all
 # @pets_no_sponsors = Pet.where.not(id: Sponsor.select("pet_id")).select("id")
 @pets = Pet.includes(:sponsors)
end

Делая делегирование сейчас, я делаю только запрос, который отправляет все необходимое в мой индекс.

0 голосов
/ 13 января 2019

Вы используете сквозную таблицу для объединения пользователей и домашних животных, но ваши ассоциации не настроены должным образом. Для сквозной модели необходимо иметь сквозную таблицу have_many и ассоциацию has_many:: through. Ваши ассоциации должны выглядеть так:

class Pet < ApplicationRecord
 has_many :adoptions
 belongs_to :race, required: false
 **has_many :sponsors**
 has_many :users, through: :sponsors
end

class User < ApplicationRecord
 **has_many :sponsors**
 has_many :pets, through: :sponsors
end
...