В проекте, который я сейчас разрабатываю под rails 4.0.0beta1, у меня возникла необходимость в пользовательской аутентификации, в которой каждый пользователь может быть связан с сущностью. Я новичок в рельсах и испытываю некоторые неприятности.
Модель выглядит следующим образом:
class User < ActiveRecord::Base
end
class Agency < ActiveRecord::Base
end
class Client < ActiveRecord::Base
belongs_to :agency
end
Мне нужно, чтобы пользователь мог ссылаться как на агентство, так и на клиента, но не на обоих (эти два - это то, что я буду называть сущностями). Он не может иметь никакой ссылки вообще и не более одной ссылки.
Первое, что я искал, - это как наследование Mutli-Table (MTI) в рельсах. Но некоторые вещи заблокировали меня:
- он не был доступен из коробки
- MTI выглядела довольно сложно для новичков, таких как я
- камни, реализующие решения, казались старыми или слишком сложными или не полными
- драгоценные камни, вероятно, сломались бы под рельсами4, поскольку они не обновлялись какое-то время
Поэтому я искал другое решение, и я нашел полиморфные ассоциации.
Я был на этом со вчерашнего дня и занял некоторое время, чтобы заставить его работать даже с помощью Rails polymorphic has_many: through и ActiveRecord, has_many: through и Polymorphic Associations
Мне удалось привести примеры из вышеприведенного вопроса, но потребовалось некоторое время, и у меня, наконец, возникли две проблемы:
- Как преобразовать отношения в пользователе в ассоциацию has_one и иметь доступ к "слепому" связанному объекту?
- Как установить ограничение, чтобы ни один пользователь не мог иметь более одного объекта?
- Есть ли лучший способ сделать то, что я хочу?