Рельсы сортируют только по ID, когда контент из другой таблицы? - PullRequest
0 голосов
/ 17 февраля 2012

Я новичок в RoR, и у меня проблема с моим "приложением".

У меня есть таблица с именем "annonces" и таблица с именем "marques".(Это как "post" и "category" для приложения блога)

Я слежу за скринкастом # 228 Railscasts, но когда я хочу отсортировать столбец "Marque", он сортируется по ID ине по имени ...

Итак, вопрос в том, как мне сделать столбец сортируемой таблицы с несколькими таблицами?

Это больше "щелчок по заголовку для сортировки по этому атрибуту".

Например, если вы щелкнете по названию столбца (Marque), это должно отсортировать по алфавиту ASC и DESC: AUDI - BMW - VOLKSWAGEN / Повторный щелчок: VOLKSWAGEN - BMW - AUDI.

Но на данный момент Rails сортирует меня вот так (ID): 1 - 2 - 3 // 3 - 2 - 1. Вот как это выглядит: VOLKSWAGEN - AUDI - BMW // BMW - AUDI / VOLKSWAGEN.

Как я уже сказал, я слежу за этим скринкастом: http://railscasts.com/episodes/228-sortable-table-columns

Вы можете увидеть на этой странице несколько результатов.

Но в моем случае это с несколькими таблицами (Marque, Modele, Energie ...)

Скринкаст отлично работает, когда все в одной таблице.

Но я хочусделать это с содержимым из другой таблицы.

В моем annonce_controller:

  helper_method :sort_column, :sort_direction
  def index
    @annonces = Annonce.order(sort_column + " " + sort_direction)
    @modeles = Modele.all
    @marques = Marque.order(sort_column + " " + sort_direction)
    @energies = Energy.all

  end
...
...
 private

  def sort_column
  Annonce.column_names.include?(params[:sort]) ? params[:sort] : 
"marque_id"
  end

  def sort_direction
    %w[asc desc].include?(params[:direction]) ? params[:direction] : 
"asc"
  end
end

Для "индекса индекса" я попытался:

    @annonces = Annonce.order(sort_column + " " + sort_direction)
    @marques = Marque.all

и

@annonces = Annonce.find(params[:id])
@marques = Marque.order(sort_column + " " + sort_direction)

В моем marque_controller:

class MarquesController < ApplicationController
  helper_method :sort_column, :sort_direction

  def index
    @marques = Marque.order(sort_column + " " + sort_direction)
  end
...
...
  private

  def sort_column
    Marque.column_names.include?(params[:sort]) ? params[:sort] : 
"marque"
  end

  def sort_direction
    %w[asc desc].include?(params[:direction]) ? params[:direction] : 
"asc"
  end
end

модель annonce.rb:

class Annonce < ActiveRecord::Base
  attr_accessible :marque_id, :modele_id, :price, :type, :energy_id, 
:power
  belongs_to :marque
  belongs_to :modele
  belongs_to :energy
end

модель marque.rb:

class Marque < ActiveRecord::Base
  attr_accessible :marque
  has_many :modeles
  has_many :annonces
end

Вид: annonce: index.html.erb

<table>
  <tr>
  <th><%= sortable "marque_id" %></th>
    <th><%= sortable "modele_id" %></th>
    <th><%= sortable "price" %></th>
    <th><%= sortable "power" %></th>
    <th><%= link_to "Energy", :sort => "energy_id" %></th>


<% for annonce in @annonces %>
  <tr>
    <td><%= annonce.marque.marque %></td>
    <td><%= annonce.modele.try(:modele) %></td>
    <td align="right"><%= annonce.price %> €</td>
    <td align="right"><%= annonce.power %></td>
    <td><%= annonce.energy.try(:energy) %></td>
  </tr>
<% end %>
</table>

Вид маркировки выглядит следующим образом.

Мои таблицы выглядят так:

Объявления:

    create_table :annonces do |t|
      t.integer :marque_id
      t.integer :modele_id
      t.string :price
      t.string :power
      t.string :energy

Marque:

    create_table :marques do |t|
      t.string :marque

      t.timestamps

Надеюсь, это поможет ...

Я бы создал все это, выполнив: rails g scaffold marque marque: string Или: rails g scaffoldannonce marque_id: целое число [...]

Спасибо!

++++

Ответы [ 2 ]

0 голосов
/ 18 февраля 2012

Спасибо Райану из RailsCasts, которые «указывают мне правильное направление»;)

В моем annonces_controller:

 def index
@annonces = Annonce.joins(:marque, :modele, :energy).order(sort_column + "  " + sort_direction)
@modeles = Modele.all
@marques = Marque.all
@energies = Energy.all

end

И я заменил это в приватном разделе:

  private

  def sort_column
    params[:sort] || "marque" && "modele" && "energy"
  end

Спасибо!

0 голосов
/ 17 февраля 2012

Check MetaSearch , который может предоставить вам хороших помощников для этого. Если вы хотите увидеть проект, который его использует, отметьте Active Admin .

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