Типизация моделей базового класса в сценарии наследования одной таблицы (STI) - PullRequest
4 голосов
/ 30 ноября 2009
class User < ActiveRecord::Base   
end  

class Consumer < User 
end  

class Merchant < User 
end   

u = User.find(id)  

Как набрать приведение переменной u к типу Потребитель?

Ответы [ 5 ]

14 голосов
/ 30 ноября 2009

Я нашел ответ на это. Класс ActiveRecord :: Base имеет метод для этой цели:

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002334

Код будет

u = User.find(id)
u = u.becomes(u.type.constantize)
2 голосов
/ 01 декабря 2009

Из-за ошибки в STI средство поиска ActiveRecord возвращало экземпляр базового класса (User) вместо экземпляра подкласса (Consumer). Я думал, что это поведение по умолчанию и, следовательно, хотел привести экземпляр базового класса (пользователь) к экземпляру подкласса (потребитель). Мое предыдущее решение стало излишним после устранения ошибки. т.е.

u = User.find(id) # returns an instance of Consumer class
1 голос
/ 01 декабря 2009

Вы всегда можете получить Потребителя как такового:

u = Consumer.find(id)
1 голос
/ 30 ноября 2009

Вам нужен столбец с именем 'type', а rails сделает все остальное. Например:

id = Consumer.create!(...).id

# later on

User.find(id).is_a? Consumer  # ==> true
0 голосов
/ 22 апреля 2015

Если вы используете Factory Girl, это то, что вы хотите: create(:consumer).becomes(Consumer)

В противном случае create(:consumer) создает только объект User.

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