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 :

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 : #228 Sortable Table Columns - RailsCasts

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: