通过options_from_collection_for_select()访问具有连接和包含的ActiveRecord对象

时间:2015-12-12 07:07:12

标签: ruby forms ruby-on-rails-4 rails-activerecord html-select

当我使用时:

<%= @employees.first.actor.name %>
# someones name...

作品!但是当我这样做时:

options_from_collection_for_select(@employees, 'id', 'actor.name')

对于同一页面上的select标签,控制器中的方法相同;它会:

undefined method `actor.name' for #<Employee:0x0000000b0f3218>

不是&#39; options_from_collection_for_select()&#39;前者的简写?为什么我会收到此错误?

我用过:

@employees = Employee.includes(:actor).joins(:actor)

1 个答案:

答案 0 :(得分:0)

是的,options_from_collection_for_select是一种捷径,但它可以通过使用send来调用对象上具有给定名称的方法。并且send无法处理actor.name等嵌套调用。

我会通过delegating方法actor_nameactor.name解决此问题。将以下内容添加到您的模型中:

# app/models/employee.rb
delegate :name, to: :actor, prefix: true

然后将您的观点更改为:

options_from_collection_for_select(@employees, :id, :actor_name)