Rails 3 - как получить данные через ассоциации - PullRequest
2 голосов
/ 09 февраля 2012

Целый день я борюсь с получением данных от ассоциаций. У меня есть эти 3 модели:

Пользователь

  has_many :user_cars

Car

  has_one :user_cars

UserCar

  belongs_to :car
  belongs_to :user  

Таблица user_cars имеет столбцы

user_id
car_id

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

Я пытаюсь сделать это как:

<% @user_cars.car.name%>

Но это дает мне ошибку

undefined method `car' for #<ActiveRecord::Relation:0x0000012edc14a8>

Я хотел бы спросить вас - есть ли у меня ошибка уже в ассоциациях или в представлении?

EDIT:

<% @cars.each_with_index do |car, i|%> #loop through all cars in the system
  #in the every loop I would like to print, if the user has this one

  <% @user_cars.each do |c| %> #through the loop I can get it, but I think is not efficient 
    <li><%= c.car.name %></li>
  <% end %>

<% end %>

Ответы [ 2 ]

3 голосов
/ 09 февраля 2012

Как инициализируется @user_cars?Кажется, вы принимаете User # user_cars в качестве значения.Попробуйте

<% @user_cars.each do |c| %>
  <li><%= c.car.name %></li>
<% end %>

И вы также можете использовать has_many :through, чтобы упростить соединение:

# User model
has_many :user_cars
has_many :cars, :through => :user_cars

Тогда все автомобили, принадлежащие пользователю, могут быть доступны через Пользовательские автомобили.*

Если вы хотите проверить, принадлежит ли данный автомобиль пользователю, вы можете сначала получить все автомобили, принадлежащие пользователю (не забудьте сначала добавить вышеупомянутые строки в модель пользователя):

@owned_cars = current_user.cars.all

А затем проверьте, включен ли данный автомобиль в этот список:

<% @cars.each_with_index do |car, i|%> #loop through all cars in the system
  <% if @owned_cars.include?(car) %>
    <%= car.name %> is owned by the user
  <% else %>
    <%= car.name %> is not owned by the user
  <% end %>
<% end %>
0 голосов
/ 09 февраля 2012

Вы можете использовать has_and_belongs_to_many. Проверьте документацию: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

...