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