【问题标题】:Rails 3.1 Polymorphic Association problem with legacy tableRails 3.1遗留表的多态关联问题
【发布时间】:2011-06-24 21:53:08
【问题描述】:

假设我有一个名为 server 的旧 MySQL 表,其中包含字段 serverid:integerservername:string.

我创建了一个名为 action 的新表,其中包含:

t.integer   :actionable_id
t.string    :actionable_type
t.string    :text

而且我希望这张表与旧版服务器有一个 poly 关系 表。

当我这样做时:

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

我尝试为给定的Action 获取Server

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自动识别。

【问题讨论】:

    标签: activerecord polymorphic-associations ruby-on-rails-3.1


    【解决方案1】:

    科利,

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多