我有两个对象,Vpn
和Organisation
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
答案 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
个对象。