Rails 3.1 Проблема полиморфной ассоциации с устаревшей таблицей - PullRequest
0 голосов
/ 25 июня 2011

Допустим, у меня есть устаревшая таблица 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 должно автоматически распознаваться первичным_ключем цели.

1 Ответ

1 голос
/ 08 марта 2012

Kolrie,

У нас была такая же проблема в моем магазине. Наше решение было довольно простым. Мы просто определили метод, который был назван так же, как полиморфные отношения. Итак, в вашем случае вы бы определили метод с именем actionable и сделали бы следующее:

def actionable
  self.actionable_type.constantize.find(self.actionable_id)
end

Не уверен, что это сработало бы для вас, но это неплохо, пока приложение Rails не будет исправлено для поддержки переопределения primary_keys при использовании полиморфных отношений.

...