Rails 4: цикл через ассоциацию

У меня возникли проблемы при зацикливании некоторых ассоциаций:

#=> member.rb
has_one :academic

#=> academic.rb
belongs_to :member

Все идет нормально. Однако когда я перебираю связь, я получаю:

undefined method 'each' for #<Academic:0x007fc98b2b7210>

Вот мой взгляд (показать):

<% if !@member.academic.nil? %>
 <% fields_academic = [:major, :second_major, :minor, :second_minor] %>

  <h1>Academics</h1>

  <% @member.academic.each do |academic| %>
 <%= render 'database/shared/display', model_obj: academic, data: academic, fields: fields_academic %>
  <% end %>
<% end %>

Код застрял на each метод.

@member определяется как = Member.find(params[:id])

Любая помощь будет с благодарностью. Заранее спасибо!

3 ответа

Решение

Согласно вашему коду нет нескольких экземпляров academic связанные с данным member (это определяется с помощью has_one связь).

Ответ: вы не можете их зациклить.

Правильный код для вашего просмотра должен быть:

<% if @member.academic.present? %>
 <% fields_academic = [:major, :second_major, :minor, :second_minor] %>
  <h1>Academics</h1>
  <%= render 'database/shared/display', model_obj: @memeber.academic, data: academic, fields: fields_academic %>
 <% end %>
<% end %>

Если ваше намерение состояло в том, чтобы иметь в своем составе много ученых, используйте has_many вместо.

class Member
  has_many :academics
end

each должен использоваться в коллекции записей(я имею в виду, что приводит к нескольким записям). В настоящее время @member.academic вернет одну запись, так как это has_one связь между member а также academicтак что вы не можете зацикливаться на этом. Может быть, вы должны изменить свою ассоциацию на has_many :academics и зациклить это как <% @member.academics.each do |academic| %>

Метод: каждый перебирает блок в соответствии с тем, как был построен этот Enumerable. Если блок не указан, возвращает себя. Enumerable представляет собой миксин, который предоставляет коллекциям некоторые полезные методы. В вашем примере academic это не перечисляемый, но единственный объект. Вы должны использовать has_many ассоциация.

Другие вопросы по тегам