Lorena Bento
Lorena Bento

Reputation: 554

Hash with 'nil' value when using `group` and `count` in query

In Rails, I get a hash using includes:

<% @teste = UserProfile.includes(:mobile_models).group(:name).count  %>

The problem is that includes generates a hash like the following:

{nil=>4774, "2610"=>7, "2626"=>4, "2630"=>5, "2760"=>4, "3250"=>3, "355"=>5, "3I607 BlackJack"=>5, "5230"=>13, "5235"=>4, "5310"=>5, "5500"=>5, "5800 Xpress Music"=>16, "6020"=>4, "6120c"=>4, "6131"=>4, "7210"=>5, "A1200r"=>5, "A1900"=>5, "AIKO 70"=>5, "B3410W Ch@t"=>4, "beTouch E100"=>4, "BlackBerry 8320 (Curve)"=>10,....

In my database, I don't find any mobile record with the name "nil". Checking my database, I can't find what might be producing this nil.

The other goal is to sum all values, like this:

 <%= sum = @teste.values.sum %>

But when I do this, the 'nil' is added too.

---Update

models/UserProfile

class UserProfile < ActiveRecord::Base
  has_and_belongs_to_many :mobile_models, join_table: 'user_profiles_mobile_models', order: 'name'

models/MobileModel

class MobileModel < ActiveRecord::Base
  belongs_to :mobile_maker

Upvotes: 2

Views: 2054

Answers (2)

Pradnyesh patil
Pradnyesh patil

Reputation: 321

You are getting that hash because of group(:name). That means you have 4774 records who's name is nil.

Upvotes: 0

Lukas
Lukas

Reputation: 3235

Because you are grouping by :name, some of the MobileModel or UserProfile objects have the name attribute set to nil. You will need to check both as without seeing the model definition, I can't tell which model has the :name property you are grouping on. If you can share the model code, I can be more explicit.

If both models have a name attribute, you can be more explicit in your group statement:

UserProfile.includes(:mobile_models).group('mobile_models.name')

or...

UserProfile.includes(:mobile_models).group('user_profiles.name')

Also, if a number of your users do not have any mobile_models to include, I believe they will get dumped into the nil grouping as well.

Upvotes: 3

Related Questions