2012-02-09 4 views
2

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

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

has_many :user_cars 

автомобилей

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 %> 

ответ

3

Как инициализируется @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

ZelluX правильный. @user_cars - это коллекция автомобилей, поэтому вам нужно перебирать коллекцию с помощью метода 'each'. –

+0

Спасибо, ребята, это частично решает мою проблему - частично потому, что из 2 циклов. Я обновил свое оригинальное сообщение - посмотри на это, пожалуйста. Что ты мне помог - это работает. Но теперь у меня есть ситуация, когда у меня есть цикл в цикле - и я хотел бы спросить вас, если это более эффективный способ ... – user984621

+0

@ user984621 Не могли бы вы опубликовать, как инициализируется user_cars? – ZelluX

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