轨道中的两个型号以及如何将它们组合在一起

时间:2016-06-17 19:55:24

标签: ruby-on-rails ruby activerecord

我正在使用Rails 4开发一个简单的项目。我现在有两个模型 - 作者和书籍。我目前拥有它,所以模型看起来像这样:

class Author < ActiveRecord::Base
   has_many :books
end

class Book < ActiveRecord::Base
  belongs_to :author
end

作者控制器看起来像这样:

class AuthorsController < ApplicationController

def index 
  @authors = Author.all
  @book = Book.find(params[:author_id])
  (Not sure if the @book line is right)
end 

我的架构如下所示:

  create_table "authors", force: :cascade do |t|
    t.string   "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "books", force: :cascade do |t|
    t.string   "title"
    t.string   "genre"
    t.string   "description"
    t.integer  "author_id"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
  end

我拥有它以便我的书籍index.html.erb我可以看到写这本书的作者。例如:&lt;%= book.author.name%&gt;。这就像我想要的那样。现在我想在我的作者index.html.erb页面上做的是显示属于作者的所有书籍。

在作者的index.html.erb页面上,我有以下内容:

<h1>All Authors</h1>
<p><%= link_to "New", new_author_path, class: "btn btn-primary" %></p>

<div class="container">
  <div class="row">
    <% @authors.each do |author| %>
      <h1><%= author.name %></h1>
      <p><%= author.book.title %></p>
      <%= link_to "Show", author_path(author), class: "btn btn-primary" %>
      <%= link_to "Edit", edit_author_path(author), class: "btn btn-warning"    
      %>
      <%= link_to "Delete", author_path(author), method: :delete, data: {   
      confirm: "Are you Sure?" }, class: "btn btn-danger" %>
   <% end %>
  </div>
 </div>

我认为,我需要帮助的主线如下: &lt;%= author.book.title%&gt;同样,我的主要问题是如何获得它以便在我的作者索引页面上看到他们写的所有书籍?嵌套我的路线,如下:

  resources :posts do 
    resources :comments
  end 

还是有另一种方式吗?感谢您的帮助,如果您需要更多信息,请告诉我们。

1 个答案:

答案 0 :(得分:0)

我相信你会像这样循环阅读书籍:

<h1>All Authors</h1>
<p><%= link_to "New", new_author_path, class: "btn btn-primary" %></p>

<div class="container">
  <div class="row">
    <% @authors.each do |author| %>
      <h1><%= author.name %></h1>
      <% author.books.each do |book| %>
        <p><%= book.title %></p>
      <% end %>
      <%= link_to "Show", author_path(author), class: "btn btn-primary" %>
      <%= link_to "Edit", edit_author_path(author), class: "btn btn-warning"    
      %>
      <%= link_to "Delete", author_path(author), method: :delete, data: {   
      confirm: "Are you Sure?" }, class: "btn btn-danger" %>
   <% end %>
  </div>
 </div>

上述方法可行,但效率不高,因为它会导致(N + 1)查询。

解决这个问题的方法是:

在你的控制器中,

def index
  @authors = Author.includes(:books)
end

这仍然会减慢您的数据库速度,但添加限制和分页可能有助于解决这个问题。