2014-07-21 48 views
0

我試圖排列數組中的一列,但未排序顯示的值沒有按姓氏順序排列。在視圖中發佈排序陣列

這是我的表:

|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

不要在視圖中執行'<%@ a = p.client(:order =>「lastname1 ASC」)%>'。在控制器中執行此操作,並在視圖中訪問「@ a」。 –

+0

@瘦男人怎麼可能是正確的答案?你能幫我嗎? –

回答

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

上面的行在技術上什麼都不做。當你已經在循環中並且要求當前產品的客戶時,它會返回多少?只有一個,對吧?對,如果你在另一邊有一個belongs_to(我希望你這樣做,這個答案依賴於它)。所以你實際上是在每次迭代中「排序」一組元素。這就是爲什麼你的選擇忽略了「按順序」。你應該做的是獲得所有按客戶「lastname1」訂購的產品清單。這不應該像你想要做的那樣在視圖中完成,而應該在你的控制器中完成。在你的控制器:

#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 %> 
+0

謝謝,我根據這個測試了代碼並工作了,謝謝你,先生,你太聰明瞭。 –

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

不知道這是否回答你的問題,但在第二td,再培訓局變量沒有打印出任何頁面。檢查你的語法。

如果你真的想設置@a等於類似的東西,最好在控制器中完成。

這只是我注意到的。我會繼續看你的代碼,看看我能否找到你爲什麼沒有得到你想要的結果。

+0

怎麼可能是正確的解決方案? –

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