Ruby on Rails 2 - 对belongs_to,has_one,has_many等的困惑

时间:2014-01-30 12:04:31

标签: ruby-on-rails ruby activerecord rails-activerecord ruby-on-rails-2

我有两个对象,VpnOrganisation

organisation.rb

has_many :vpns, :foreign_key => "managed_by"

vpn.rb

belongs_to :managed_by, :class_name => "Organisation", :foreign_key => "managed_by"

因此,vpns表格中有一个managed_by列,实际上是一个组织ID,但我不想将其命名为organisation_id以避免混淆。

有了这个关联,在我的列表视图中我可以做到

<%= vpn.managed_by.nil? ? '' : vpn.managed_by.name %>

要获取managed_by字段所涉及的组织的名称,但如果我尝试更新属性,我会得到ActiveRecord::AssociationTypeMismatch in VpnController#update,因此出于某种原因需要一个对象而不是字符串,params在请求中发送的是预期的:

{"id"=>"1",
 "authenticity_token"=>"RWu39MOqDiu8vbuAfPzyJXAP1CKIaxIFoUjwLl2pemc=",
 "commit"=>"Save",
 "vpn"=>{"id"=>"1",
 "managed_by"=>"999"}}

为避免遗漏任何内容,我的表单中的managed_by会使用select显示为collection_select菜单:

<%= collection_select 'vpn', 'managed_by', @organisations, :id, :name, {:selected_value => @vpn.managed_by} %>

其中@organisations只是包含所有组织的有效记录结果。

如果我将belongs_to中的vpn.rb更改为

belongs_to :organisation, :class_name => "Organisation", :foreign_key => "managed_by"

更新工作正常,但在列表视图中我尝试检索组织名称时出错:

undefined method `name' for 999:Fixnum

1 个答案:

答案 0 :(得分:1)

你正在做的事情非常令人困惑:你有两件事(一个属于关联和外键)都叫做managed_by。我认为你无法做任何让Rails处理的事情。如果您想在数据库中保留managed_by列,则应该考虑您的关联的另一个名称。

我建议您使用:

belongs_to :organisation, :class_name => "Organisation", :foreign_key => "managed_by" 
像你已经尝试过的那样。要修复视图中的错误,您必须使用以下命令:

<%= vpn.organisation.nil? ? '' : vpn.organisation.name %>

使用vpn.managed_by时,Rails会查看外键,它是一个整数,而不是Organisation个对象。