Объектные отношения Rails

#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.