Relacje wiele-do-wielu są tutaj jedyną realną opcją. Nie bez powodu nazywają to relacyjną bazą danych.
Czemu?
- Dołączenia w rzeczywistości nie są tak drogie.
- Wiele kolumn — liczba kolumn w twoich tabelach będzie ludicris i będzie to prawdziwe piekło dla programistów. Ponieważ każda funkcja dodaje migrację, ilość rezygnacji w Twojej bazie kodu będzie głupia.
- Kolumna tablicowa — użycie kolumny tablicowej może wydawać się atrakcyjną alternatywą, dopóki nie zdasz sobie sprawy, że jest to w rzeczywistości tylko marginalna poprawa w stosunku do umieszczania elementów w ciągu oddzielonym przecinkami. nie masz integralności referencyjnej i żadna z korzyści organizacji kodu, które wynikają z posiadania modeli reprezentujących encje w Twojej aplikacji.
Och i za każdym razem, gdy funkcja jest szarpana, musisz zaktualizować każdego z tych ponad 500 000 użytkowników. VS tylko za pomocą CASCADE.
class Feature
has_many :user_features
has_many :users, through: :user_features
end
class UserFeature
belongs_to :user
belongs_to :feature
end
class User
has_many :user_features
has_many :features, through: :user_features
def has_feature?(name)
features.exist?(name: name)
end
end