#ruby-on-rails #orm
#ruby-on-rails #orm
Вопрос:
Допустим, у меня есть приложение Rails, и каждый пользователь, который им пользуется, является, например, квадратом. Большинство пользователей являются только квадратами, но некоторые люди могут действовать как квадраты, так И треугольники.
Треугольники будут иметь другие (больше) атрибутов, чем квадраты, такие как стороны разной длины, тип треугольника и т.д. После прочтения has_many :through
я не уверен, следует ли мне
-
Создайте таблицу соединений или
-
Просто добавьте несколько дополнительных атрибутов, которые по умолчанию равны нулю, если пользователь не может действовать как треугольник.
Если бы я создал таблицу соединений, я бы просто создавал соединения с треугольниками на подходящих квадратах?
С наступающим 4 июля!
Комментарии:
1. Я думаю, что вам нужно наследование одной таблицы
Ответ №1:
STI
В дополнение к Beerlington
комментарию вы, вероятно, захотите взглянуть на наследование одной таблицы —
#app/models/shape.rb
Class Shape < ActiveRecord::Base
has_many :users
end
#app/models/user/triangle.rb
Class Triangle < Shape
end
#app/models/users/square.rb
Class Square < Shape
end
Это должно позволить вам установить:
#app/models/user.rb
Class User < ActiveRecord::Base
belongs_to :shape
delegate :type, to: :shape, prefix: true #-> allows you to call @user.shape_type
end
—
Ассоциации
Хотя я думаю, что ассоциации, скорее всего, должны будут проходить через унаследованные модели, эта настройка позволит вам использовать требуемые атрибуты в любом из файлов, которые вам нужны.
Например, с помощью приведенной выше настройки вы могли бы использовать следующее:
@triangles = Triangle.all
@trianbles.each do |triangle|
triangle.user.name
end
Некоторые вещи, которые вам следует учитывать:
- Вы хотите сохранить единый источник достоверности (единую таблицу базы данных)
- Вы хотите рассмотреть роль определенных фигур в вашей системе (как вы будете вызывать квадрат / треугольник)
- Как различные элементы влияют на систему (вы вызываете Triangle прямо или косвенно)?
Комментарии:
1. Я думаю, вам нужно только
has_many :users
в классе Shape, поскольку другие наследуют от этого и будут иметь такое же поведение
Ответ №2:
Если я правильно понимаю вашу проблему, вам действительно не нужны has_many :through
отношения.
Я бы предложил настроить это следующим образом:
Пользователи
belongs_to :square
belongs_to :triangle
Квадраты
has_many :users
Треугольники
has_many :users
Для этих ассоциаций понадобились бы внешние ключи в таблице Users.