在simple_form中获取嵌套模型的关联

时间:2014-07-29 13:58:24

标签: ruby-on-rails ruby simple-form

我不知道必须从其他模型中获取关联和值的选择框。 例如,我有一个表course_names来记录课程名称。

我还有其他表格,其他表格course有更多列course_name_id

class Course < ActiveRecord::Base

  belongs_to :course_name

end

现在,我必须创建student_profile并与courses表关联。

class Student < ActiveRecord::Base

  belongs_to :course
  ...
end

在简单形式的视图中,我必须创建一个选择框来选择课程。

<%= simple_form_for(@student_profile) do |f|%>
    <% f.error_notification %>
    <div class="form-inputs">
        <%= f.association :course  %>

但是这个协会并没有显示课程名称。

<select class="select optional form-control" id="student_course_id" name="student[course_id]"><option value=""></option>
<option value="3">#&lt;Course:0x00000105c23818&gt;</option></select>

但我希望输出为(course_names选项的课程名称)

<select class="select optional form-control" id="student_course_id" name="student[course_id]">
<option value=""></option>
<option value="3">course-name</option>
</select>

我是如何做到这一点的。 一,解决方案

<%= f.association :course,collection:Course.all.includes(:course_name).map{|a|[a.course_name.name,a.id]}  %>

但这看起来不对吗?我如何告诉协会从协会获取课程名称。

1 个答案:

答案 0 :(得分:1)

您是否尝试过使用此标签:label_method:

<%= f.association :course, label_method: :course_name  %>

或者当然课程属于course_name,也许你想要这个:

<%= f.association :course, label_method: lambda { |course| "#{course.course_name.name}"}  %>

修改要避免所有查询,您应该预加载数据

courses = Course.includes(:course_name)

然后按以下方式使用

<% f.association :course, collection: courses, label_method: lambda { |course| "#{course.course_name.name}" } %>