0

假设我有一个旧的 MySQL 表,名为server字段serverid:integerservername: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 值吗?

这是多态关系错误吗?

编辑:应用下面的更改(添加primary_key)后,它适用于服务器关系,但我确信它对于其他关系会失败。

class Action < ActiveRecord::Base
  belongs_to :actionable, :polymorphic => true, :primary_key => 'serverid'
end

IMO,primary_key的值应该被目标的primary_key自动识别。

4

1 回答 1

1

科尔里,

我们在我的商店遇到了同样的问题。我们的解决方案非常简单。我们简单地定义了一个与多态关系同名的方法。因此,在您的情况下,您将定义一个名为 actionable 的方法并执行以下操作:

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

不确定这是否适合您,但在修复 Rails 应用程序以支持在使用多态关系时覆盖 primary_keys 之前,这是一个很好的解决方法。

于 2012-03-08T15:19:23.597 回答