我正在尝试在数组内部排序列但是没有排序显示的值没有使用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
请有人帮助我吗?
答案 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