Nano Hash - криптовалюты, майнинг, программирование

Rails 3 — как получить данные через ассоциации

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

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

  has_many :user_cars

Автомобиль

  has_one :user_cars

Автомобиль пользователя

  belongs_to :car
  belongs_to :user  

В таблице user_cars есть столбцы

user_id
car_id

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

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

<% @user_cars.car.name%>

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

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

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

ИЗМЕНИТЬ:

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

Ответы:


1

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

Тогда все автомобили, принадлежащие пользователю, могут быть доступны через 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 %>
09.02.2012
  • ZelluX прав. @user_cars — это коллекция автомобилей, поэтому вам нужно перебрать коллекцию с помощью метода each. 09.02.2012
  • Спасибо, ребята, это частично решает мою проблему - частично из-за 2 петель. Я обновил свой оригинальный пост - посмотрите на это, пожалуйста. Что вы мне помогли - то работает. Но сейчас у меня ситуация, когда у меня есть петля в петле - и я хотел бы спросить вас, есть ли более эффективный способ... 09.02.2012
  • @ user984621 Не могли бы вы опубликовать, как инициализируется user_cars? 10.02.2012
  • @ZelluX, конечно, это оно: @ user_cars = UserCar.where(:user_id => current_user.id) 10.02.2012

  • 2

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

    09.02.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..