Я работаю над созданием некоторых моделей для баз данных wikimedia, расположенных в викимедийных лабораториях, и из-за технических проблем есть две таблицы для ревизий.Обработка двух почти идентичных таблиц как одна модель
В одной таблице revision
содержатся все изменения, но отсутствует указатель на имя пользователя из-за его представления, состоящего из выражения, для пустых имен пользователей для некоторых версий.
Другая таблица revision_userindex
имеет индекс, но вместо этого ей не хватает исправлений, в которых затрагивается гашение.
Кроме этого, они идентичны, и я хотел бы иметь возможность использовать его как одну единственную модель, а не передавать детали нижнего уровня индекса пользователю.
В настоящее время у меня есть следующий код:
class Revision < ActiveRecord::Base
self.table_name = :revision_userindex # or :revision
self.primary_key = :rev_id
has_many :externallinks, :class_name => 'Externallink', :foreign_key => :el_from
has_many :iwlinks, :class_name => 'Iwlink', :foreign_key => :iwl_from
has_many :langlinks, :class_name => 'Langlink', :foreign_key => :ll_from
has_many :pagelinks, :class_name => 'Pagelink', :foreign_key => :pl_from
has_many :recentchanges, :class_name => 'Recentchange', :foreign_key => :rc_this_oldid
belongs_to :page, :class_name => 'Page', :foreign_key => :rev_page
belongs_to :user, :class_name => 'User', :foreign_key => :rev_user
has_many :templatelinks, :class_name => 'Templatelink', :foreign_key => :tl_from
has_many :texts, :class_name => 'Text', :foreign_key => :old_id
end
Но я не знаю ни одного способа динамически установить self.table_name
в зависимости от когда пользователь задается в контексте или нет. т.е.
Revision.find_by_page("page")
Revision.find(nnn)
Revision.where(...) # where the query doesn't link to the user table
@page.revisions
# etc...
следует использовать revision
таблицу и
Revision.find_by_user("user")
@user.revisions
следует использовать revision_userindex
таблицу
Если это, где это возможно осуществить без реализовав половину AR, я был бы рад узнать.
Первичная_запись одинакова для обеих таблиц.
Для справки, вот определение, если таблицы:
Сначала для пересмотра:
CREATE ALGORITHM=UNDEFINED DEFINER=`viewmaster`@`%` SQL SECURITY DEFINER VIEW `revision` AS
SELECT `enwiki`.`revision`.`rev_id` AS `rev_id`,
`enwiki`.`revision`.`rev_page` AS `rev_page`,
if((`enwiki`.`revision`.`rev_deleted` & 1),NULL,`enwiki`.`revision`.`rev_text_id`) AS `rev_text_id`,
if((`enwiki`.`revision`.`rev_deleted` & 2),NULL,`enwiki`.`revision`.`rev_comment`) AS `rev_comment`,
if((`enwiki`.`revision`.`rev_deleted` & 4),NULL,`enwiki`.`revision`.`rev_user`) AS `rev_user`,
if((`enwiki`.`revision`.`rev_deleted` & 4),NULL,`enwiki`.`revision`.`rev_user_text`) AS `rev_user_text`,
`enwiki`.`revision`.`rev_timestamp` AS `rev_timestamp`,
`enwiki`.`revision`.`rev_minor_edit` AS `rev_minor_edit`,
`enwiki`.`revision`.`rev_deleted` AS `rev_deleted`,
if((`enwiki`.`revision`.`rev_deleted` & 1),NULL,`enwiki`.`revision`.`rev_len`) AS `rev_len`,
`enwiki`.`revision`.`rev_parent_id` AS `rev_parent_id`,
if((`enwiki`.`revision`.`rev_deleted` & 1),NULL,`enwiki`.`revision`.`rev_sha1`) AS `rev_sha1`
FROM `enwiki`.`revision`
И revision_userindex:
CREATE ALGORITHM=UNDEFINED DEFINER=`viewmaster`@`%` SQL SECURITY DEFINER VIEW `revision_userindex` AS
SELECT `enwiki`.`revision`.`rev_id` AS `rev_id`,
`enwiki`.`revision`.`rev_page` AS `rev_page`,
if((`enwiki`.`revision`.`rev_deleted` & 1),NULL,`enwiki`.`revision`.`rev_text_id`) AS `rev_text_id`,
if((`enwiki`.`revision`.`rev_deleted` & 2),NULL,`enwiki`.`revision`.`rev_comment`) AS `rev_comment`,
`enwiki`.`revision`.`rev_user` AS `rev_user`,
`enwiki`.`revision`.`rev_user_text` AS `rev_user_text`,
`enwiki`.`revision`.`rev_timestamp` AS `rev_timestamp`,
`enwiki`.`revision`.`rev_minor_edit` AS `rev_minor_edit`,
`enwiki`.`revision`.`rev_deleted` AS `rev_deleted`,
if((`enwiki`.`revision`.`rev_deleted` & 1),NULL,`enwiki`.`revision`.`rev_len`) AS `rev_len`,
`enwiki`.`revision`.`rev_parent_id` AS `rev_parent_id`,
if((`enwiki`.`revision`.`rev_deleted` & 1),NULL,`enwiki`.`revision`.`rev_sha1`) AS `rev_sha1`
FROM `enwiki`.`revision`
WHERE ((`enwiki`.`revision`.`rev_deleted` & 4) = 0)
Разве это не требует от контроллера выбора какой модели использовать в зависимости от того, когда пользователь находится в контексте или нет? Кроме того, primary_key всегда будет одинаковым, это только имя таблицы, которое отличается. – azatoth