2017-01-12 3 views
0

Я пытаюсь создать запрос ActiveRecord в моем приложении Rails, который включает внутреннее соединение двух таблиц, хотя одна из записей, к которым я пытаюсь присоединиться, - это сериализованный массив (строка) , Например, у меня три таблицы. Ассоциации выглядеть следующим образом:Rails ActiveRecord join с массивом

  • Автомобиль:

    serialize :categories_id, Array 
    belongs_to :postings 
    belong_to :categories 
    
  • Категория:

    has_many :cars 
    has_many :postings, through: :cars 
    
  • Проводка

    has_many :categories, through: :cars 
    has_many :cars 
    

Это мой cars стол (обратите внимание на массив):

select cars.* from cars 

id: 23, 
posting_id: 10, 
categories_id: [1, 5, 20] 

Это мой categories стол:

select categories.* from categories 

id: 20, 
name: "BMW" 

Это мой postings стол:

select postings.* from postings 

id: 20, 
title: "First title", 
description: null, 
value: "open" 

Джойн Я хочу для создания аналогичен этому:

select categories.* from categories inner join cars on categories.id = 
cars.categories_id where cars.posting_id = 20 

За исключением прямо сейчас, это не возвращает никаких результатов, потому что соединение на cars.category_id является массивом. Я в основном хочу вернуть все связанные categories из столбца categories_id в таблицу cars. Есть идеи, как это сделать?

+1

Шаг 1: Забудьте, что 'serialize' существует. Шаг 2. Используйте отдельную таблицу вместо этого 'serialize' kludgery. Шаг 3: ... Шаг 4: Прибыль. 'serialize' - это уродливый хак, который иногда кажется хорошей идеей в то время, но почти всегда приводит к боли, страданиям и слезам. Не используйте его. Когда-либо. –

+1

Шаг 5: Вы поймете, что «сериализация» сделала вашу жизнь трудной, когда вы планируете интегрировать поиск. – Surya

ответ

0

Official document для сериализатора ActiveRecord указывает, что сериализованный атрибут будет сохранен как YAML в базе данных. Когда вы сохраняете запись или извлекаете запись, сериализация и десериализация атрибута для правильного типа (массив в вашем случае) происходит на уровне ruby ​​activerecord, который не обрабатывается как массив на уровне базы данных. Это недостаток использования сериализованных атрибутов, и мы можем в значительной степени ограничить загрузку и сохранение данных.

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

автомобили

belongs_to :postings 
has_many :cars_categories 
has_many :categories, through: :cars_categories, :source => :category 

Категория

has_many :postings, through: :cars 
has_many :cars_categories 
has_many :cars, through: :cars_categories, :source => :car 

Надеется, что это помогает.

Пожалуйста, обратитесь к этому answer.

+0

Спасибо за ответ @ user3775217, похоже, что я не должен сериализовать 'categories_id'! Есть ли у вас какие-либо предложения о том, как я могу использовать Array для 'cars.categories_id', поскольку я намерен в конечном итоге вернуть связанные« категории »для каждого идентификатора в массиве. –

+0

Да, я упомянул в ответ, что вы должны посмотреть на новую таблицу (cars_categories), чтобы поддерживать belongs_to_and_has_many через отношения. cars_categories будет иметь category_id и car_id для сопоставления автомобилей, принадлежащих нескольким категориям, и наоборот. – user3775217

+0

yes Значение по умолчанию - YAML, отредактировано. благодаря – user3775217

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