2014-05-02 59 views
0

我試圖展示客戶使用的所有玩具。如何根據條件分組信息?

問題是顯示沒有選中狀態的所有玩具。

當我選擇一個狀態時,結果應取決於所選狀態。

表:

|toys| 
    |id| |name|  |client_id| |status| 
    1 facebook  1   0 
    2 whatsup  1   1 
    3 android  2   0 
    4 google   2   1 
    3 iphone   3   0 

|clients| 
    |id| |name| 
    1 ZUCK 
    2 GATES 
    3 JOBS 

這裏是控制器:

def index 
    if params[:status]=="3" 
    @data= Toy.find(:all,:conditions=>['status IN (0,1,2)' ]) 
    @client_groups = Toy.find(:all, :include => :client, :conditions=>['status IN (0,1,2)' ],:group=>['client_id']) 
    else 
    @data= Toy.find(:all,:conditions=>['status= ?',params[:status] ]) 
    @client_groups = Toy.find(:all, :include => :client,:conditions=>['status = ?',params[:status] ],:group =>['client_id']) 
    end 
end 

在這裏,模型:

class Client < ActiveRecord::Base 
    has_many :toys 
end 

class Toy < ActiveRecord::Base 
    belongs_to :client  
end 

這裏是視圖:

<% form_tag :controller=>"toy",:action=>"index" do %> 
    Status: 
    <%= select_tag "status", "<option value=\"3\">All</option>"+ options_for_select([ ["Active",0],["Inactive",1]],params[:status].to_i) %> 
    <%= submit_tag "SEARCH", :name => nil %> 
<% end %> 
<%= render :partial=>"table" %> 

下面是部分視圖:

<table border="1"> 
<% @client_groups = @data.group_by{|toy| toy.client.name} %> 
<% @client_groups.each do |client_name, toys| %> 
    <tr><td>Client Name</td></tr> 
    <tr><td><%= client_name %></td></tr> 
    <tr> 
    <td></td> 
    <td>Name Toy</td> 
    <td>State Toy</td> 
    <tr> 
    <% toys.each do |toy| %> 
    <tr> 
    <td></td> 
    <td><%= toy.name %></td> 
    <td><%= toy.status %></td> 
    </tr> 
    <% end %> 
<% end %> 
</table> 

的局部視圖表示本:

enter image description here

我試圖示出了由客戶機這樣的信息組:

enter image description here我試過

<% @client_groups = @data.group_by{|toy| toy.client.name} %> 
<% @client_groups.each do |client_name, toys| %> 
    <tr><td>Client ID</td><td>Client Name</td></tr> 
    <tr><td><%= client_name.id %></td></tr> 
    <tr><td><%= client_name.name %></td></tr> 
    <tr> 
    <td></td> 
    <td>Name Toy</td> 
    <td>State Toy</td> 
    <tr> 

enter image description here

請有人可以幫助我?

所有類型的幫助將被接受。

回答

2

您可以通過2種方式來完成。這種簡單的方法是將你行你目前他們使用group_by之前(這是假設的Ruby 1.8.7或更高版本):

<% @client_groups = @data.group_by{|toy| toy.client } %> 
<% @client_groups.each do |client, toys| %> 
    <tr><td>Client Id</td><td>Client Name</td></tr> 
    <tr><td><%= client.id %></td><td><%= client.name %></td></tr> 
    <tr> 
    <td></td> 
    <td>Name Toy</td> 
    <td>State Toy</td> 
    <tr> 
    <% toys.each do |toy| %> 
    <tr> 
     <td></td> 
     <td><%= toy.name %></td> 
     <td><%= toy.status %></td> 
    </tr> 
    <% end %> 
<% end %> 

另一種方法將使用SQL/ActiveRecord的,這實際上是更有效的是組。我不記得在Rails的2.X使用正確的格式,但它應該是這樣的:

@client_groups = Toy.find(:all, :include => :client, 
            :conditions=>['status IN (0,1,2)' ], 
            :group => 'client_id') 

然後使用已經分組@client_groups收集如上。

請注意,我用:include躍躍欲試負載client協會(以避免N + 1分的情況,其中每個玩具觸發額外的查詢服務器以找到客戶端) - 這應該是無論分組策略的實現。您還可以重構您的控制器代碼,以保持乾燥:

status_condition = params[:status]=="3" ? 
    ['status IN (0,1,2)'] : 
    ['status= ?',params[:status] ] 
@data= Toy.find(:all, :conditions=> status_condition, 
         :include => :client)   # add :group if grouping in the query 
+0

Pinny,編輯該帖子,因爲我想顯示客戶端的id。可以幫我嗎? –

+0

只需group_by {| toy | 「#{toy.client.id} |#{toy.client.name}」} ...然後在你的​​小號 – JakeTheSnake

+0

傑克這個字符串分開,我想你的代碼,但是有錯誤 –