当内容来自其他表时,Rails只按ID排序?

时间:2012-02-17 13:32:21

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我是一名RoR初学者,我对我的" app"有疑问。

我有一张名为" annonces"和一个名为"的表marques"。 (它就像"帖子"和"类别",对于博客应用程序)

我正在关注有轨电视播报的#228屏幕截图,但是当我想要排序时 " Marque"列,按ID排序,而不是按名称排序......

所以问题是,如何使用多个表进行可排序的表列 表

它更多"点击标题按该属性进行排序"。

例如,如果您单击列的名称(Marque),则应该这样做 按字母顺序排列的ASC和DESC:奥迪 - 宝马 - 大众/重新点击: VOLKSWAGEN - 宝马 - 奥迪。

但就目前而言,Rails将我这样排序(ID):1 - 2 - 3 // 3 - 2 - 1.这就是: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

对于" def index"我试过了:

    @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>

品牌的观点看起来像这样。

我的表看起来像这样:

Annonces:

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

商品型号:

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

      t.timestamps

我希望这会有所帮助......

我通过这样做来创建所有这些:rails g scaffold marque marque:string 或者:rails g scaffold annonce marque_id:integer [...]

谢谢!

++++

2 个答案:

答案 0 :(得分:0)

检查MetaSearch,它可以为您提供一个很好的帮手。如果想要查看使用它的项目,请选中Active Admin

答案 1 :(得分:0)

感谢来自RailsCasts的Ryan,他“指出了我正确的方向”;)

在我的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

谢谢!