在用户show中的控制器中按模型属性排序

时间:2016-11-15 23:59:29

标签: ruby-on-rails sorting controller

我有一个书评/讨论网站,并希望在他们的个人资料页面上订阅所有用户的书籍,因为他们目前正在阅读该书。我在书模型中添加了一个名为current的列,当用户添加一本书时,他们可以选中一个“我正在读这个”的方框。如果用户单击该框,则book对象具有:current属性,其值为“1”。如果他们没有单击该框,则值为:current为“0”。

在我看来,我有这段代码告诉用户他们目前正在阅读哪些书籍,并且工作正常。

      <% if book.current == "1" %>
        <h4>I am currently reading this book</h4>
      <% end %>

然而,在我的show用户控制器中,我无法通过以下方式对其进行排序:当前状态。

这是我尝试过的:

def show
  @user = User.find_by_id(params[:id])
  @books= Book.all.sort { |p1, p2| p1.current <=> p2.current }
end

def show
  @user = User.find_by_id(params[:id])
  @books = Book.all
  @books = @books.order(:current)
end

def show
  @user = User.find_by_id(params[:id])
  @books = Book.all
  @books = @books.order(current: :desc)
end

并且,只是为了确保它以正确的方式

def show
  @user = User.find_by_id(params[:id])
  @books = Book.all
  @books = @books.order(current: :asc)
end

没有工作。并且,没有抛出错误,他们只是不对它进行排序。最新而不是第一本的“当前”书。这是显示和循环用户书籍的代码。此代码也可以正常工作。

<% @user.books.each do |book| %>
  <% if params[:id].to_s == book.user_id.to_s %>
    <ul class="profileDisplay" >

      <img alt="Book Jacket" class="homepageImages" src=<%= book.image %> >
      <% if book.current == "1" %>
        <h4>I am currently reading this book</h4>
      <% end %>
      <p><b>Contributor: </b><%= book.user.name %></p>
      <p><b>Title: </b><%= book.title %></p>
      <p><b>Author: </b><%= book.author %></p>
      <p><b>Genre: </b><%= book.genre %></p>
      <p><b>Publication Date: </b><%= book.publication_date %></p>
      <p><b>Publisher: </b><%= book.publisher %></p>
      <p><b>Synopsis: </b><%= book.synopsis %></p>
      <% if params[:id] == session[:user_id].to_s || params[:action] == "profile" %>
        <%= button_to "Edit Book", book_edit_path(book.id), method: "get", class: "btn btn-primary col-xs-2" %>
        <%= button_to "Delete Book", delete_book_path(book.id), method: :delete, data: {confirm: "Are you sure you want to delete this book and all it's reviews?"}, class: "btn btn-danger col-xs-2" %>
      <% end %>
    </ul>
  <% end %>
<% end %>

2 个答案:

答案 0 :(得分:2)

在视图中,@user.books尚未排序。

您对它们进行了排序并将其分配到@books

我认为应该是这样的

<强> CONTROLLER

def show
  @user = User.find_by_id(params[:id])
  @books = @user.books.order(current: :desc)
end

查看

<% @books.each do |book| %>
  <!-- show book records here -->
<% end %>

答案 1 :(得分:0)

在图书模型中添加默认范围

default_scope  { order(:current=> :desc) }

和您的控制器

@user = User.find_by_id(params[:id])

和观看次数

<% @user.books.each do |book| %>
  #do whatever
<% end %>