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!
++++

On Feb 15, 2012, at 4:34 PM, Dl33ter Yay wrote:

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!
++++

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

<% for annonce in @annonces %>

<% end %>
<%= sortable "marque_id" %> <%= sortable "modele_id" %> <%= sortable "price" %> <%= sortable "power" %> <%= link_to "Energy", :sort => "energy_id" %>
<%= annonce.marque.marque %> <%= annonce.modele.try(:modele) %> <%= annonce.price %> € <%= annonce.power %> <%= annonce.energy.try(:energy) %>

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:

++++

On Feb 16, 2012, at 7:44 AM, Dl33ter Yay wrote:

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