Хобрук: Ваш путь к мастерству в программировании

Rails: ассоциация ActiveRecord has_many не работает

Я немного новичок в ассоциациях Rails Active Record. Я пытался установить связь, но получаю сообщение об ошибке ActiveRecord при попытке получить данные. Я неправильно связал свои модели?

У пользователя много загрузок, у которых много пользовательских графиков:

class User < ActiveRecord::Base
  has_many :uploads, through: :user_graphs
end

class Upload < ActiveRecord::Base
  has_many :users, through: :user_graphs
end

class UserGraph < ActiveRecord::Base
  belongs_to :user
  belongs_to :upload
end

Я хочу получить все загрузки пользователя и все графики пользователя. 2-я строка не работает в консоли rails и выдает ошибку

@user = User.find(1)
@uploads = @user.uploads

Ошибка:

ActiveRecord::HasManyThroughAssociationNotFoundError: Could not find the association :user_graphs in model User

Дополнительный кредит:

Если у пользователей есть загрузки с пользовательскими графами... разве это не должно быть has_many :uploads и has_many :user_graphs, through :uploads?


Ответы:


1

Добавлять

has_many :user_graphs

к классам User и Upload.

Опция :through определяет вторую ассоциацию поверх этой.

09.12.2013
  • Спасибо @tyler - разве это не должно быть has_many :user_graphs через :uploads? Я перевернул его в коде моего сообщения? 09.12.2013

  • 2

    Вы не сказали Rails, что у вас есть ассоциация user_graphs с User, только ассоциация uploads. Поэтому, когда Rails следует за ассоциацией user_graphs на uploads, он не может ее найти.

    Итак, вам нужно добавить ассоциацию user_graphs. Ваши модели должны выглядеть так:

    class User < ActiveRecord::Base
      has_many :user_graphs                       # <<< Add this!
      has_many :uploads, through: :user_graphs
    end
    
    class Upload < ActiveRecord::Base
      has_many :user_graphs                       # <<< Add this!
      has_many :users, through: :user_graphs
    end
    
    class UserGraph < ActiveRecord::Base
      belongs_to :user
      belongs_to :upload
    end
    
    09.12.2013
  • Спасибо @Джон! Отличный ответ о том, что на самом деле пытается сделать Rails :) 09.12.2013
  • На самом деле получил ошибку рельсов - когда я пошел, чтобы получить user_graphs сейчас. Ошибка связана с ActiveRecord::Associations::CollectionProxy []› 09.12.2013
  • графики = User.find(1).uploads.user_graphs 09.12.2013
  • Также синтаксис в модели User звучит странно. Разве это не has_many :uploads и has_many :user_graphs через :uploads? 09.12.2013
  • @DonnyP: Вы не можете сделать user.uploads.user_graphs, потому что загрузки — это коллекция, и в этой коллекции нет метода user_graphs. Вы бы просто сделали user.user_graphs. 09.12.2013
  • Спасибо @John, но мне также кажется, что я изменил свое сквозное утверждение. Разве это не должен быть пользователь has_many загрузок. Пользователь также has_many user_graphs через загрузки? 09.12.2013
  • @DonnyP: Нет, это неправильно. Вы можете найти связанный Uploads для User через запись UserGraph. Когда вы говорите has_many :foos в классе Bar, это означает, что в Foo должен быть столбец bar_id. Когда вы добавляете :through, это означает, что вы можете найти эту ассоциацию, просматривая указанную таблицу. В этом случае вы можете найти uploads, взглянув на таблицу user_graphs: has_many :uploads, :through => :user_graphs. 09.12.2013
  • Новые материалы

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

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

    React Hooks: основы деструктуризации массива
    Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

    Пакеты R, используемые в Tesla
    Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

    Сокращение и слияние токенов для эффективных моделей VL: обзор
    Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..