在视图中发出排序数组

时间:2014-07-21 23:11:17

标签: ruby-on-rails ruby ruby-on-rails-2

我正在尝试在数组内部排序列但是没有排序显示的值没有使用lastname ASC排序。

这是我的表:

|products|
  |id| |money| |client_id|
   1     1000      1
   2     2000      4
   3     2000      7
   4     2000      5
   5     2000      6
   6     2000      3
   7     2000      2

|customers|
  |id| |name|    |lastname1|    |lastname2|
   1    Lionel     Messi        Bueno
   2    Cristiano  Ronaldo      Tiger
   3    Cecs       Fabregas     Midtlon
   4    Andres     Iniesta      Blanco
   5    Neymar     Dos Santos   Junior

这是我的控制器

class ProductController < ApplicationController
  def index
    @products= Product.all
  end
end  

这是模型

class Client < ActiveRecord::Base
  has_many :products

  def str_name
     return lastname1.to_s+" "+lastname2.to_s+" "+name.to_s
  end
end

class Product < ActiveRecord::Base
   belongs_to :client
end

这是我的观点

<table>
  <tr>
    <td>Money</td>
    <td>Client</td>     
  </tr>

  <% @products.each do |p| %>
  <tr> 
    <td><%= p.money %></td>
    <td><%= p.str_name %></td>
  <% end %>
  </tr> 
</table>

我试过但不是通过lastname1 asc:

订购
  <% @products.each do |p| %>
  <tr> 
    <td><%= p.money %></td>
    <td><% @a= p.client(:order=>"lastname1 ASC")%> <%= @a.str_name %></td>
  <% end %>

日志是:

 SELECT * FROM `clients` WHERE (`clients`.`id` = 1)
 SELECT * FROM `clients` WHERE (`clients`.`id` = 2)
 SELECT * FROM `clients` WHERE (`clients`.`id` = 3)
 SELECT * FROM `clients` WHERE (`clients`.`id` = 4)

应该是这样的:

 SELECT * FROM `clients` order by last_name1 ASC

请有人帮助我吗?

3 个答案:

答案 0 :(得分:1)

<% @a= p.client(:order=>"lastname1 ASC")%> <%= @a.str_name %></td>

上面一行在技术上没什么。当您已经处于循环中并且您要求当前产品的客户时,它将返回多少?只有一个吧?是的,如果你在另一边有一个belongs_to(我希望你这样做,这个答案依赖于它)。所以你实际上是排序&#34;每次迭代一组元素。这就是为什么你的选择忽略&#34;顺序&#34;。你应该做的是获得他们各自客户订购的所有产品的清单。 &#34; lastname1&#34 ;.这不应该在您尝试这样做的视图中完成,而应该在您的控制器中完成。在您的控制器中:

#In Rails 4
@products = Product.joins(:client).order('clients.lastname1 ASC')

#Other version (be careful where to use plurals and where not to)
@products = Product.find(:all, :joins => :client, :order => 'clients.lastname1 ASC')

在你看来:

<% @products.each do |p| %>
  <tr> 
    <td><%= p.money %></td>
    <td><%= p.client.str_name %></td>
  </tr>
<% end %>

答案 1 :(得分:0)

  <% @products.each do |p| %>
  <tr> 
    <td><%= p.money %></td>
    <td><% @a= p.client(:order=>"lastname1 ASC")%> <%= @a.str_name %></td>
  <% end %>

不确定这是否可以回答您的问题,但在第二个td中,ERB标记不会向页面打印任何内容。检查你的语法。

如果你真的试图将@a设置为类似的东西,那么最好在控制器中完成。

这只是我注意到的事情。我会继续查看您的代码,看看我是否能找到您无法获得所需结果的原因。

答案 2 :(得分:0)

在您的代码中,看起来每个产品只有一个客户端,但我不能确定,因为您没有为您的产品型号发布代码。如果是这种情况,则p.client将只返回一个客户端,并且没有理由对结果进行排序; ActiveRecord可能足够聪明,可以跳过该步骤。这也可以解释您日志中的查询。

如果您想在客户端和产品之间建立多对多关系,则应创建连接表。

rails generate model ClientProduct client_id:integer product_id:integer

您的关系将是

客户端:

class Client < ActiveRecord::Base
  has_many :client_products
  has_many :products, :through => :client_products
  ...
end

产品:

class Product < ActiveRecord::Base
  has_many :client_products
  has_many :clients, :through => :client_products
  ...
end

ClientProduct:

class ClientProduct < ActiveRecord::Base
  belongs_to :client
  belongs_to :product
  ...
end