Próbuję wybrać instancję modelu ("Pakiet") przez jego relację z dwoma innymi modelami, do których należy ("Cut" i "Animal"). Chociaż istnieje, powiedzmy, wiele pakietów z :cut_id 3 i wiele z :animal_id 4, powinien być tylko jeden z obydwoma i chcę wybrać ten jeden i wyświetlić jego zawartość w tabeli.

Próbowałem następującego bałaganu DIY i tak naprawdę nie działa. (cutfind to metoda, którą stworzyłem, o której wiem, że działa w celu wywołania wszystkich cięć związanych z danym zwierzęciem.)

<% @animal.cutfind.each do |cut| %>
  <tr>
    <td><%= cut.name %></td>
    <td><%= number_to_currency(cut.price) %></td>
    <td><%= cut.package_weight %> lb</td>
        <% @a = Package.where(:animal_id => @animal.id) %>
        <% @pset = @a.where(:cut_id => cut.id) %>
    <% @pset.each do |p| %>
        <td><%= p.original %></td>
        <td><%= p.left %></td>
    <% end %>
  </tr>
<%end%>

Masz pomysł, jak to zrobić [lepiej]? Dziękuję.

Aktualizacja: Próbowałem tego innego bałaganu DIY i mam ten sam problem (komórki nie są nawet tworzone, co prowadzi mnie do przekonania, że ​​@pset jest pusty).

To jest w moim modelu zwierzęcym:

def packagefind
    Package.where(:animal_id => self.id)
end

A potem zmieniłem powyższe tak:

<td><%= cut.package_weight %> lb</td>
        <% @pset = @animal.packagefind.where(:cut_id => cut.id) %>
    <% @pset.each do |p| %>
        <td><%= p.original %></td>
        <td><%= p.left %></td>
    <% end %>
2
Sasha 25 wrzesień 2012, 01:05

2 odpowiedzi

Najlepsza odpowiedź

Ponieważ nie jestem w stanie komentować twojego posta, zgaduję: masz następującą architekturę:

Wytnij -> Pakiet <- Zwierzę

W tym przypadku „->” i „<-” są relacjami jeden-do-wielu, więc

class Package < ActiveRecord::Base
  has_many :cuts
  has_many :animals
end

Więc chcesz "tego" pakietu, który ma Cut o id 3 i Animal id 4. Czy próbowałeś:

x = Product.select { |product| product.cuts.include?(Cut.find(3)) }.select{ |product| product.animals.include?(Animal.find(4)) }

?

EDYCJA: Najpierw zasugerowałem ci użycie

Product.find_by_product_id_and_animal_id() 

Co nie zadziałało, ale pokazało OP, jak to zrobić

2
Raul Pinto 26 wrzesień 2012, 13:45

Railsy automatycznie wygenerują metody, które pomogą Ci znaleźć powiązane rekordy, jeśli zdefiniujesz następujące relacje:

class Animal
  has_many :cuts
  has_many :packages, :through => :cuts
end

class Cut
  belongs_to :animal
  belongs_to :package
end

class Package
  has_many :cuts
  has_many :animals, :through => :cuts
end

W kontrolerze następujący wiersz eager załaduje wszystkie rekordy, które chcesz Twoim zdaniem potrzebujesz:

@animal = Animal.includes(:cuts => :package)

Twój widok można następnie skrócić do:

<% @animal.cuts.each do |cut| %>
  <tr>
    <td><%= cut.name %></td>
    <td><%= number_to_currency(cut.price) %></td>
    <td><%= cut.package_weight %> lb</td>
    <td><%= cut.package.original %></td>
    <td><%= cut.package.left %></td>
  </tr>
<%end%>
3
cdesrosiers 25 wrzesień 2012, 02:04