Создание правильных модельных ассоциаций - PullRequest
1 голос
/ 28 октября 2019

Используя рубин сиквел gem, у меня есть небольшая (sqlite3) база данных со следующей схемой:

db.create_table :item_types do
  primary_key :id
  String :name, unique: true, null: false
end

db.create_table :item_values do
  primary_key :id
  String :name, unique: true, null: false
end

db.create_table :items do
  primary_key :id
  foreign_key :type, :item_types, key: :id
  foreign_key :value, :item_values, key: :id
  String :name, unique: true, null: false
  String :desc, null: false
end

В идеале я хотел бы иметь возможностьиспользуйте аналогично

item = Item.first(...)
puts item.type.name, item.value.name

При чтении руководства ассоциация похоже, что мне нужна ассоциация one_to_one в модели Item для item_types и item_values. Тем не менее, я не уверен, как правильно их связать. Должен ли внешний ключ передаваться через опцию key, или есть более подходящий метод?

1 Ответ

0 голосов
/ 28 октября 2019

Руководство иллюстрирует настройку связи один ко многим с этим примером:

# Database schema:
#  artists            albums
#   :id   <----\       :id
#   :name       \----- :artist_id 
#                      :name

class Artist < Sequel::Model
  one_to_many :albums
end

class Album < Sequel::Model
  many_to_one :artist
end

Если честно, я никогда не использовал Sequel, но из руководства кажется, что вы должны делать что-то вроде:

class ItemType < Sequel::Model
  one_to_many :items
end

class ItemValue < Sequel::Model
  one_to_many :items
end

class Item < Sequel::Model
  many_to_one :type, class: 'ItemType', key: 'item_type_id'
  many_to_one :value, class: 'ItemValue', key: 'item_value_id'
end

Поздравляю. Вы только что перенесли EAV-шаблон в Sequel.

...