Проблема наследования отдельных таблиц Rails и имен подклассов - PullRequest
1 голос
/ 05 июля 2010

У меня есть 3 класса:

class User < ActiveRecord::Base
  has_many :events, :foreign_key => 'owner_id'
end

class Event < ActiveRecord::Base
  belongs_to :owner, :class_name => 'User', :foreign_key => 'owner_id'
end

class Event::User < Event

end

Класс Event имеет поле 'type' и работает как STI. Теперь я создаю событие:

Event::User.create(:owner => User.first)

=> #<Event::User id: 8, owner_id: 1, title: nil, type: "Event::User", created_at: "2010-07-05 00:07:32", updated_at: "2010-07-05 00:07:32">

А теперь я хочу получить владельца создаваемого события, но получить:

Event.last.owner

=> #<Event::User id: 1, owner_id: 1, title: nil, type: "Event::User", created_at: "2010-07-04 23:28:31", updated_at: "2010-07-04 23:28:31">

Журнал SQL дал мне следующее:

Event::User Load (0.4ms)   SELECT * FROM "events" WHERE ("events"."id" = 1) AND ( ("events"."type" = 'Event::User' ) )

Похоже, что рельсы ищут сначала внутренний класс с таким именем, а потом уже внешний. Конечно, я могу изменить имя внутреннего класса, но это плохо для проекта, может быть, есть другой способ?

1 Ответ

1 голос
/ 05 июля 2010

Я не совсем понимаю, что вы хотите сделать здесь. Если вы хотите использовать STI, то подклассами модели «Событие» должны быть типы событий, такие как «Встреча», «Вечеринка» или что-то в этом роде.
class Event::User < Event определяет Event::User как тип события. Я не думаю, что это то, что вы хотите сделать.

Если то, что вы пытаетесь сделать, это отношение «один ко многим» (пользователь может создать много событий, у события есть только один владелец), то более простой способ сделать это - добавить поле в модель событий » user_id ", а затем добавьте следующее к модели событий:

class Event
  belongs_to :owner, :foreign_key => 'user_id'
end

Это позволяет вам делать такие вещи, как: User.first.events (массив событий для первого пользователя) и Event.last.owner (объект пользователя, представляющий владельца последнего события)

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