Порядок упорядочения альбомов, отображаемых на странице шоу категории - PullRequest
0 голосов
/ 21 января 2020

Хорошо, это будет немного скучно, так что терпите меня.

У меня есть индексная страница альбома, где отображаются все мои альбомы, я могу переупорядочить их в зависимости от созданного времени и лайков. мой код для этого следующий (просто не обращайте внимания на то, что некоторые вещи закомментированы, я еще не выяснил, как делать еженедельные топ-лайки и топ-лайки за все время, но это еще одна проблема для другого поста)

# album.rb
    scope :latest, -> { order(created_at: :desc) }
    #scope :weekly,    -> { order(likes: :desc) }
    #scope :alltime,   -> { order(likes: :desc) }

    def self.sort_by(sort_param)
        case sort_param
        when 'latest'
            latest
        #when 'weekly'
            #weekly
        #when 'alltime'
            #alltime
        else
            latest
        end
    end
#album controller
  def index
    @albums = Album.sort_by(params[:order])
  end
#album index
<table>
  <tbody>
    <%= link_to "Latest", albums_path(order: :latest) %><br>
    <%= link_to "Weekly Top", albums_path(order: :weekly) %><br>
    <%= link_to "All-Time Top", albums_path(order: :alltime) %>
  </tbody
</table>

<table>
  <tbody>
    <% @albums.each do |album| %>
      <tr>
        <td><%= link_to album.name, album %></td>
        <td><%= link_to image_tag(album.cover_image.variant(resize: "200x200")), album %></td>
        <td><%#= album.videos #%></td>
      </tr>
    <% end %>
  </tbody>
</table>

хорошо, я помогаю, все работает так, как ожидалось, и меняет порядок моих альбомов на странице указателя альбомов в зависимости от того, какая ссылка выбрана ... теперь на мою актуальную проблему, у меня есть все альбомы привязаны к категории. Когда я go вхожу в свои категории и выбираю одну, я перехожу на страницу показа категории для этой категории и отображаю все альбомы, которые попадают в указанную категорию c, отлично !. Теперь я борюсь с тем, как я могу изменить порядок альбомов на странице показа категорий, как я делал это на странице указателя альбомов выше?

Я пробовал несколько разных комбинаций вещей, но не смог заставить их работать. Вот что у меня есть

#category.rb
    scope :latest, -> { order(created_at: :desc) }
    #scope :weekly,    -> { order(likes: :desc) }
    #scope :alltime,   -> { order(likes: :desc) }

    def self.sort_by(sort_param)
        case sort_param
        when 'latest'
            latest
        #when 'weekly'
            #weekly
        #when 'alltime'
            #alltime
        else
            latest
        end
    end
#category controller
  def show
    @categories = Category.sort_by(params[:order])
  end
#category show
<table>
  <tbody>
    <%= link_to "Latest", categories_path(order: :latest) %><br>
    <%= link_to "Weekly Top", categories_path(order: :weekly) %><br>
    <%= link_to "All-Time Top", categories_path(order: :alltime) %>
  </tbody
</table>

<table>
    <tbody>
    <% @category.albums.map.each do |album| %>
        <tr>
            <td><%= link_to album.name, album %></td>
            <td><%= link_to image_tag(album.cover_image.variant(resize: "200x200")), album %></td>
        </tr>
    <% end %>
    </tbody>
</table>

Так что я уверен, что я ошибаюсь в части контроллера категорий, а также в путях, которые я вызываю на странице шоу.

Также я даже не уверен, должен ли я был ввести код в модель категории или смог бы вызвать код из модели альбома, когда я пытаюсь переупорядочить альбомы на странице показа категории.

Любой совет по этому вопросу будет принята с благодарностью. Заранее спасибо.

1 Ответ

0 голосов
/ 21 января 2020

Предполагая, что likes - это целочисленный столбец:

Для создания альбомов и категорий, созданных на этой неделе, вам необходимо определить области действия следующим образом:

scope :weekly, -> { where("created_at <= ?", DateTime.current.beginning_of_the_week) }
scope :latest,    -> { order(created_at: :desc) }
scope :by_likes,    -> { order(likes: :desc) }

Обратите внимание, что «Еженедельно» - это не заказ, а фильтр. Когда вы не примените его, вы получите «все время».

Теперь в представлениях вы можете сделать:

    <%= link_to "Latest", categories_path(order: :latest) %><br>
    <%= link_to "Weekly Top", categories_path(weekly: true, order: :by_likes) %><br>
    <%= link_to "All-Time Top", categories_path(order: :by_likes) %>

и аналогичные вещи для альбомов.

Теперь в контроллерах вы можете сделать:

# categories controller
  def show
    @categories = Category.find(params[:id])

    @albums = @category.albums

    @albums = @albums.weekly if params[:weekly]

    @albums = @albums.by_likes if params[:order] == "by_likes"
    @albums = @albums.latest if params[:order] == "latest"
  end
# albums controller
  def index
    @albums = Album.all

    @albums = @albums.weekly if params[:weekly]

    @albums = @albums.by_likes if params[:order] == "by_likes"
    @albums = @albums.latest if params[:order] == "latest"
  end

А затем вы можете просто использовать переменную @albums в представлении категорий, например:

@albums.each do |album|
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...