sortable table by name instead of ID

Hi!

I'm a RoR beginner, and I have a problem with my "app".

I have a table called " annonces " and a table called " marques ".
(It's like "post" and "category", for a blog app)

I'm following the screencast #228 of railscasts, but when I want to sort
the "Marque" column, it sort by ID and not by name...

So the question is, how do I do a sortable table column, with multiple
table?

If you need some of my code, juste ask what part you want.

Thanks!

Hi!

I'm a RoR beginner, and I have a problem with my "app".

I have a table called " annonces " and a table called " marques ".
(It's like "post" and "category", for a blog app)

I'm following the screencast #228 of railscasts, but when I want to sort
the "Marque" column, it sort by ID and not by name...

So the question is, how do I do a sortable table column, with multiple
table?

Could you clarify if you want this to be sortable in the sense of "drag to sort", in the sense of "click on a header to sort by that attribute", or simply that you want to get the records out in a particular order when you request them in your controller?

If you mean the last of these, then you could do something as simple as:

  @marques = Marque.order(:name)

Walter

Hi!

It's more "click on a header to sort by that attribute".

For example, if you click on the name of the column (Marque) this should
sort alphabetical ASC and DESC: AUDI - BMW - VOLKSWAGEN / Re-click :
VOLKSWAGEN - BMW - AUDI.

Like I said in my 1st post, I'm following this screencast :
http://railscasts.com/episodes/228-sortable-table-columns

You can see on this page a thumbail of the result.

But in my case, it's with multiple table ( Marque, Modele, Energie...)

The screencast work perfectly when everything is in the same table.

But I want to do it with content from other table.

Again, if you need my code, juste ask what you want.

Thanks for your answer.
Bye!

Hi!

It's more "click on a header to sort by that attribute".

For example, if you click on the name of the column (Marque) this should
sort alphabetical ASC and DESC: AUDI - BMW - VOLKSWAGEN / Re-click :
VOLKSWAGEN - BMW - AUDI.

Like I said in my 1st post, I'm following this screencast :
http://railscasts.com/episodes/228-sortable-table-columns

You can see on this page a thumbail of the result.

But in my case, it's with multiple table ( Marque, Modele, Energie...)

The screencast work perfectly when everything is in the same table.

But I want to do it with content from other table.

Again, if you need my code, juste ask what you want.

What does your controller look like, and what does your view look like where you build this table? If you're pulling from multiple models, you're doing that somewhere in the controller (I hope) and building an array for marques, models and energies. That's where the sorting needs to happen.

Walter

In my 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

For the " def index " I tried :
@annonces = Annonce.order(sort_column + " " + sort_direction)
@marques = Marque.all

and

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

In my 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

the annonce.rb model :
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
the marque.rb model :
class Marque < ActiveRecord::Base
  attr_accessible :marque
  has_many :modeles
  has_many :annonces
end

The view : 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>

The view of marque look like this.

My tables looks like that :

Annonces:
    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

I hope this will help...

I'd create all this by doing : rails g scaffold marque marque:string
Or : rails g scaffold annonce marque_id:integer [...]

Thank you again :wink: