Rails Single Table Inheritance без столбца «тип» - PullRequest
0 голосов
/ 14 января 2010

Я портирую некоторые функции на Rails и работаю с существующей таблицей, которая предназначена для комментариев.

В основном, есть два типа комментариев - комментарии профиля (столбец photo_id имеет значение null) и комментарии к фотографии (для столбца photo_id задан идентификатор фотографии)

Я получил отлично работающее наследование одной таблицы, добавив в таблицу поле типа, но мне интересно, есть ли способ заставить наследование одной таблицы работать без поля типа. Согласно документации Rails API: «Если в вашей таблице не определен столбец типа, наследование одной таблицы не будет запущено. В этом случае оно будет работать так же, как обычные подклассы без особой магии для дифференциации». между ними или перезагрузите нужный тип с помощью find. "

Мне интересно, есть ли способ, которым я могу настроить свои модели для определения типа, основываясь на том, что photo_id равен nil или имеет целочисленное значение, вместо использования столбца базы данных (который я бы не стал добавлять, если не сделаю должен.) Есть идеи?

Ответы [ 2 ]

1 голос
/ 14 января 2010

Если модели комментариев не сильно отличаются, я бы вообще не стал беспокоиться о наследовании одной таблицы. Просто добавьте:

# to Comment model
belongs_to :photo
belongs_to :profile

# to Profile model
has_many :comments

# to Photo model
has_many :comments

Тогда:

@photo.comments # will return comments associated with photos
@profile.comments # will return comments associated with profiles

Может возникнуть проблема, если у вас установлены и photo_id, и profile_id (я полагаю, это может произойти, когда вы комментируете фотографию, связанную с профилем), поэтому вы можете изменить ее в модели профиля:

has_many :comments, :conditions => "photo_id is not null"

Другой подход (я думаю, лучше) к вам полиморфные ассоциации , но вам нужно будет изменить таблицы SQL.

0 голосов
/ 14 января 2010

Я подозреваю, что вы не можете сделать это тривиально. Однако одна возможность состоит в том, чтобы заставить активную запись использовать представление, а не таблицу, и написать некоторые функции базы данных, чтобы установить этот магический атрибут на основе установленного идентификатора.

Однако, в конце концов, я подозреваю, что гораздо проще добавить столбец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...