Rails & Postgres: объединение таблиц в массив - PullRequest
0 голосов
/ 28 сентября 2018

Концептуально я пытаюсь сказать: продукт a доступен в 5 цветах, который будет представлять собой массив идентификаторов цветов.Эти идентификаторы цвета - это ключи, которые ссылаются на таблицу цветов, в которой хранятся связанные с цветом данные, такие как шестнадцатеричные представления, цветные изображения и т. Д.Наконец, я хочу объединить таблицу цветов с таблицей продуктов, чтобы можно было перетаскивать связанные с цветом данные.

В моей текущей настройке у меня есть две таблицы: products и colors.В моей таблице products у меня есть столбец (color_ids), который содержит массив целых чисел.Этот массив содержит идентификаторы colors в таблице colors.Чтобы объединить их в Rails, я создал пользовательскую строку SQL в классе Product, например:

class Product < ApplicationRecord
  has_many :colors

  def self.custom_query   
    "SELECT * FROM products JOIN colors on colors.id = ANY(products.color_ids)
    WHERE products.name = 'Some Product'"
  end

end

Я пытался использовать ассоциации (includes(:colors)), но, похоже, это не работаетосновной идентификатор представляет собой массив идентификаторов.

Есть ли более элегантный / Rails способ добиться того, что я пытаюсь сделать?

1 Ответ

0 голосов
/ 28 сентября 2018

Используйте простую has_and_belongs_to_many ассоциацию.Не храните ваши ссылочные идентификаторы в массиве, просто потому, что PostgreSQL позволяет вам делать это, а не то, как отношения должны быть реализованы в реляционных базах данных.

# new migration
create_table :colors_products do |t|
  t.references :color, foreign_key: true
  t.references :product, foreign_key: true
end
add_index :colors_products, [:color_id, :product_id], unique: true


class Product < ApplicationRecord
  has_and_belongs_to_many :colors
end

class Color < ApplicationRecord
  has_and_belongs_to_many :products
end

Тогда все методы ActiveRecord будут работать.

Почему бы вам не иметь отношения с массивами (если вы действительно не знаете, что делаете):

  1. Вы не можете использовать внешние ключи.Вы сможете иметь color_id в своем массиве, которого больше нет в базе данных.
  2. Если вы удалите цвет, ваша база данных не сможет позаботиться об автоматической очистке его идентификатора для всех продуктов.
  3. ActiveRecord (и большинство ORM) просто не будет работать, и вам потребуется огромное количество обходных путей.
...