Rails嵌套关联(通过模型建模)

时间:2015-06-19 15:47:46

标签: ruby-on-rails

我有三个模型:项目,其中包含阶段,其中包含内容

在项目show.html.erb上,我想显示与该项目关联的所有阶段,然后显示与这些阶段关联的内容。

所以这是我在 show.html.erb

中尝试的内容
<% @stages.each do |stage| %>
  <section name="concept" class="stage">
    <h3><%= stage.name %></h3>

    <% @contents.each do |content| %>
      <p><%= content.name %></p>
    <% end %>

  </section>  
<% end %>

这就是我的 projects_controller.rb

中的内容
def show
    project = Project.friendly.find(params[:id])
    @stages = project.stages

    stage = Stage.friendly.find(params[:id])
    @contents = stage.contents
  end

这是 stage.rb 模型:

class Stage < ActiveRecord::Base
    extend FriendlyId
    friendly_id :name, use: :slugged

    belongs_to :project
    has_many :contents
end

这是 contents.rb

class Content < ActiveRecord::Base
    belongs_to :stage
end

我得到的错误是:

SQLite3 :: SQLException:没有这样的列:stages.slug:SELECT“阶段”。* FROM“阶段”WHERE“阶段”。“slug”='脉冲'ORDER BY“阶段”。“id”ASC LIMIT 1

提取的来源(第16行):

stage = Stage.friendly.find(params[:id])

编辑:问题是它正在寻找具有项目ID的舞台,而不是舞台的ID。我正试图让它显示的舞台然后迭代它所属的每个内容。

2 个答案:

答案 0 :(得分:2)

项目管理员:

def show
  @project = Project.friendly.find(params[:id])
  @stages = @project.stages.includes(:contents)
end

查看:

<% @stages.each do |stage| %>
  <section name="concept" class="stage">
    <h3><%= stage.name %></h3>

    <% stage.contents.each do |content| %>
      <p><%= content.name %></p>
    <% end %>

  </section>  
<% end %>

答案 1 :(得分:0)

根据friendly_id docs,您必须运行迁移,将slug列添加到舞台模型中。确保您已完成此操作并运行rake db:migrate

这就是错误所说的:

  

SQLite3 :: SQLException:没有这样的列:stages.slug

您还没有将该列添加到阶段表中。

你必须给它舞台的id。在您的代码中,您在两个查找中使用相同的ID:

project = Project.friendly.find(params[:id])
@stages = project.stages

stage = Stage.friendly.find(params[:id])

您使用params[:id]两次。必须有一些其他可以使用的参数,假设您设置嵌套路由,可能params[:stage_id]。通常情况下,父模型将具有params[:project_id],而params[:id]将是嵌套阶段模型的ID。