【问题标题】:Ruby on Rails 2 - Confusion over belongs_to, has_one, has_many etcRuby on Rails 2 - 对 belongs_to、has_one、has_many 等的混淆
【发布时间】:2014-01-30 12:04:31
【问题描述】:

我有两个对象,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,因此由于某种原因,需要一个对象而不是字符串,请求中发送的参数符合预期:

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

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

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

其中@organisations 只是一个包含所有组织的活动记录结果。

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

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

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

undefined method `name' for 999:Fixnum

【问题讨论】:

  • 谢谢,但是你有一个关于我应该如何正确修复这种关联的例子吗?
  • 我用我的评论作为答案,并举了一个例子。希望对您有所帮助。

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


【解决方案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 对象。

【讨论】:

  • 您是否将:foreign_key =&gt; "managed_by" 放入belongs_to 电话中?
  • 太棒了,修复了它 - 真的不知道活动记录关系被命名了,我一直认为它只是表的名称,如果它是一对多等的复数形式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
相关资源
最近更新 更多