Activerecord Rails 3.1遗留表的多态关联问题

Activerecord Rails 3.1遗留表的多态关联问题,activerecord,polymorphic-associations,ruby-on-rails-3.1,Activerecord,Polymorphic Associations,Ruby On Rails 3.1,假设我有一个名为server的传统MySQL表,其中包含字段serverid:integer和 servername:string 我创建了一个名为action的新表,它将具有: t.integer :actionable_id t.string :actionable_type t.string :text 我希望此表与旧服务器具有多边形关系 桌子 当我这样做时: class Server < ActiveRecord::Base set_table_name "s

假设我有一个名为
server
的传统MySQL表,其中包含字段
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
我得到这个错误:

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
,这与它知道此处的表名相同
服务器
而不是
服务器
?它不应该使用set_primary_键值吗

这是一个多态关系bug吗

编辑:在应用下面的更改(添加主键)后,它对服务器关系有效,但我确信它对其他关系将失败

class Action < ActiveRecord::Base
  belongs_to :actionable, :polymorphic => true, :primary_key => 'serverid'
end
类操作true,:主键=>'serverid'
结束
依我看,主键的值应该由目标的主键自动识别。

Kolrie

我们在我的店里也遇到了同样的问题。我们的解决方案相当直截了当。我们只是定义了一个名为多态关系的方法。因此,在您的案例中,您将定义一个名为actionable的方法,并执行以下操作:

def actionable
  self.actionable_type.constantize.find(self.actionable_id)
end
不确定这是否适用于您,但在Rails应用程序修复为支持在使用多态关系时覆盖主_键之前,这是一个很好的解决方案

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