Допустим, у меня есть устаревшая таблица MySQL с именем server
с полями serverid:integer
и servername:string
.
. Я создал новую таблицу с именем action, которая будет иметь:
t.integer :actionable_id
t.string :actionable_type
t.string :text
И я хочу, чтобы эта таблица имела отношение поли с таблицей устаревшего сервера.
Когда я делаю это:
class Server < ActiveRecord::Base
set_table_name "server"
set_primary_key "serverid"
has_many :actions, :as => :actionable, :foreign_key => 'serverid'
end
class Action < ActiveRecord::Base
belongs_to :actionable, :polymorphic => true
end
И я пытаюсь получить Server
для данного Action
:
ruby-1.9.2-p180-patched :013 > Action.first.actionable
Я получаю эту ошибку:
Mysql2::Error: Unknown column 'server.id' in 'where clause': SELECT
`server`.* FROM `server` WHERE `server`.`id` = 10 LIMIT 1
ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column
'server.id' in 'where clause': SELECT `server`.* FROM `server` WHERE
`server`.`id` = 10 LIMIT 1
Как я могу заставить Действие знать, что первичным ключом является serverid
, а не id
, то же самоеКстати, известно, что имя таблицы здесь server
, а не servers
?Разве он не должен использовать значение set_primary_key?
Является ли это ошибкой полиморфных отношений?
EDIT: После применения изменения ниже (добавление primary_key) это работает дляОтношения с сервером, но я уверен, что это не удастся для других отношений.
class Action < ActiveRecord::Base
belongs_to :actionable, :polymorphic => true, :primary_key => 'serverid'
end
IMO, значение primary_key должно автоматически распознаваться первичным_ключем цели.