Rails如何使用条件分组数据?

时间:2015-09-11 07:21:55

标签: sql ruby-on-rails group-by

我有两张桌子,书:

book:
id
book_name
brand_id

belongs_to :brand, foreign_key: "brand_id"

和品牌:

brand:
id
brand_name

has_many :books

我想从书中分组数据并得到如下结果:

id brand_name count
1     b1        20
2     b2        32 

并在视图上显示,使用params获取值并插入到collection_select中,如:

<%= collection_select('', :brand_id, @brands , @brands.id, @brands.name + '(' + @brands.count + ')'  , {:prompt => 'please select!'} ) %><br>

我希望下拉列表如下:

B1(20) B2(3​​2)

我该怎么做? 我试过@brands = Book.group(:brand_id).count 但它只显示:

'1':20
'2':32

我不知道如何通过参数获取价值,并且没有brand_name,请给我一些建议!

2 个答案:

答案 0 :(得分:1)

您问题的可能解决方案之一是:

@brands = Brand.joins(:books).select("brands.id, brands.name, COUNT(books.id) as cnt").group("brands.id, brands.brand_name")

现在您可以将其转换为集合,select助手可以使用它:

collection = @brands.map{|b| [ "#{b.name} (#{b.cnt})", b.id ] }

并以您的形式使用它:

select 'book', 'brand_id', collection

答案 1 :(得分:0)

嘿,你可以试试这种方式。确保查询中的模型名称和表名称。它会返回一个活动的记录数组,然后您可以根据您的集合选择哈希管理:

brands = Book.joins(:brand).select("brands.id as id, brands.name as brand_name,count(*) as count").group(:brand_id)

您可以通过

创建所需的数组
@brands = brands.collect{|o| ["#{o.brand_name}(#{o.count})",o.id]}

之后,您可以传递此数组以选择标记为:

<%= select_tag  'brand_id' , options_for_select(@brands) %>