2014-05-02 169 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

杰克这个字符串分开,我想你的代码,但是有错误 –