ruby on rails - object existence not found in console but found when called in view? -


in application have user model has many relationship status_updates model.

currently, database has 1 user , 0 status_updates saved.

what bizarre when search status_updates or relationship between these objects in consol, affirms nil status_updates in database.

statusupdate.count (0.2ms)  select count(*) "status_updates"  => 0   statusupdate.any? (0.1ms)  select count(*) "status_updates"  => false     user.status_updates.count (0.2ms)  select count(*) "status_updates" "status_updates"."user_id" = 1 => 0   user.status_updates.any? (0.2ms)  select count(*) "status_updates" "status_updates"."user_id" = 1 => false  

so, that's clear me.

but, when in application write following, status_update object returned!

def end_date               if self.status_updates.any? == false   return self.status_updates.any?  elsif self.status_updates.any? == true   return self.status_updates.first  end end   

this call in view

current_user.end_date 

and returned view:

#<statusupdate:0x007fa99765d6f8> 

and if change call in view this:

current_user.status_updates.first  => <statusupdate:0x007fa99740b5f8> 

but, if call this:

current_user.status_updates.count  => 0  current_user.status_updates.any?  => true 

in view when use current_user.status_updates returns

[#<statusupdate id: nil, created_at: nil, updated_at: nil, user_id: 1, current_weight: 0.0, current_bf_pct: 0.0, current_lbm: 0.0, current_fat_weight: 0.0, change_in_weight: nil, change_in_bf_pct: nil, change_in_lbm: nil, change_in_fat_weight: nil, total_weight_change: nil, total_bf_pct_change: nil, total_lbm_change: nil, total_fat_change: nil>] 

what's going on here?!


user model relationship

has_many :status_updates, dependent: :destroy

status update model relationship

belongs_to :user


status update model

class statusupdate < activerecord::base  belongs_to :user   after_initialize :default_values   before_save :sanitize    attr_accessible :current_weight,                :current_bf_pct,                :current_lbm,                :current_fat_weight,                :change_in_weight,                :change_in_bf_pct,                :change_in_lbm,                :change_in_fat_weight,                :total_weight_change,                :total_bf_pct_change,                :total_lbm_change,                :total_fat_change,                :created_at   validates :user_id,            presence: true  validates :current_bf_pct,     presence: true, numericality: true, length: { minimum: 2, maximum:5 }    validates :current_weight,     presence: true, numericality: true, length: { minimum: 2, maximum:5 }   validates :current_lbm,        presence: true  validates :current_fat_weight, presence: true                       def sanitize       if self.current_bf_pct >= 0.5    self.current_bf_pct /= 100     if self.current_bf_pct <= 0.04       self.current_fb_pct *= 100     end   end  self.current_fat_weight = self.current_weight * self.current_bf_pct  self.current_lbm = self.current_weight - self.current_fat_weight  end     def default_values  if self.created_at == nil    self.current_bf_pct       = 0.20    self.current_weight       = 0    self.current_lbm          = 0    self.current_fat_weight   = 0    self.change_in_weight     = 0    self.change_in_bf_pct     = 0    self.change_in_lbm        = 0    self.change_in_fat_weight = 0    self.total_weight_change  = 0    self.total_bf_pct_change  = 0    self.total_lbm_change     = 0    self.total_fat_change     = 0    end  end    def previous_status_update    previous_status_update = user.status_updates.where( "created_at < ? ", self.created_at ).first     if previous_status_update == nil    return self  else    previous_status_update  end end     default_scope order: 'status_updates.created_at desc'  end 

user model:

    class user < activerecord::base       # include default devise modules. others available are:       # :token_authenticatable, :confirmable,       # :lockable, :timeoutable , :omniauthable       devise :database_authenticatable, :registerable,             :recoverable, :rememberable, :trackable, :validatable        before_create :sanitize        has_many :status_updates, dependent: :destroy       has_many :meals, dependent: :destroy       has_many :custom_foods, dependent: :destroy       has_many :meal_foods, through: :meals       # after_initialize :default_values       attr_accessor :user_password, :user_password_confirmation, :current_password       attr_accessible :email,                       :password,                       :password_confirmation,                       :current_password,                       :goal,                       :measurement,                       :bmr_formula,                       :fat_factor,                       :protein_factor,                       :remember_me,                       :deficit_amnt,                       :target_bf_pct,                       :activity_factor,                       :current_password        validates :email,                 presence: true       validates :target_bf_pct,         presence: true, on: :update, length: { minimum: 3, maximum: 4 }       validates :activity_factor,       presence: true, on: :update       validates :deficit_amnt,          presence: true, on: :update       validates :fat_factor,            presence: true, on: :update       validates :protein_factor,        presence: true, on: :update        def new?         self.created_at <= 1.minutes.ago.to_date ? true : false       end        def sanitize         #inputs         self.activity_factor       = 1.3         self.deficit_amnt          = 1         self.target_bf_pct         = 10          self.fat_factor            = 0.45         self.protein_factor        = 1       end         def end_date                      if self.status_updates.any? == false           #time.now           self.status_updates.any?         elsif self.status_updates.any? == true           #(self.start_date + self.weeks_to_goal.to_i.weeks).strftime("%m/%d/%y")           self.status_updates         end       end        def start_date                    if self.status_updates.any? == true           self.status_updates.first.created_at         end       end        def daily_caloric_deficit          self.tdee.to_d - self.daily_intake.to_d       end        def current_fat_weight            bigdecimal(self.latest_status_update.current_fat_weight, 4)       end        def current_lbm                   bigdecimal(self.latest_status_update.current_lbm, 4)       end        def current_bf_pct                bigdecimal(self.latest_status_update.current_bf_pct * 100, 4)       end        def current_weight                bigdecimal(self.latest_status_update.current_weight, 4)       end        def total_weight                  self.latest_status_update.current_weight       end      #  def lbm                       #    self.latest_status_updates.current_lbm     #  end        def recent_weight_change          bigdecimal(self.latest_status_update.current_weight - self.latest_status_update.previous_status_update.current_weight, 2)        end        def recent_lbm_change            bigdecimal(self.latest_status_update.current_lbm - self.latest_status_update.previous_status_update.current_lbm, 2)       end        def recent_fat_change         bigdecimal(self.latest_status_update.current_fat_weight - self.latest_status_update.previous_status_update.current_fat_weight, 3)       end        def total_lbm_change         bigdecimal(self.latest_status_update.current_lbm - self.oldest_status_update.current_lbm, 3)       end        def total_fat_change          bigdecimal(self.latest_status_update.current_fat_weight - self.oldest_status_update.current_fat_weight, 3)       end        def total_weight_change         bigdecimal(self.latest_status_update.current_weight - self.oldest_status_update.current_weight, 3)       end        def last_date         self.status_updates.last.created_at.strftime("%m/%d/%y")        end        def beginning_date         self.status_updates.first.created_at.strftime("%m/%d/%y")        end        def latest_status_update         self.status_updates.first         end        def oldest_status_update         self.status_updates.last       end        def bmr         cur_lbm = self.current_lbm         cur_lbm *= 0.45         '%.2f' % (370 + (21.6 * cur_lbm.to_d))       end        def target_weight         tar_bf_pct = self.target_bf_pct /= 100         '%.2f' %  ((self.total_weight * tar_bf_pct)+ self.current_lbm)       end         def fat_to_burn         '%.2f' % (self.total_weight.to_d - self.target_weight.to_d)       end        def tdee         '%.2f' % (self.bmr.to_d * self.activity_factor.to_d)       end        def deficit_pct         daily_cal_def = ((self.deficit_amnt.to_f * 3500)/7)         (daily_cal_def.to_d/self.tdee.to_d)       end        def daily_calorie_burn         '%.2f' % (self.tdee.to_d * self.deficit_pct.to_d)         end        def weekly_calorie_burn_rate         '%.2f' % (self.daily_calorie_burn.to_d*7)        end        def weeks_to_goal         '%.2f' %  (self.fat_to_burn.to_d*3500/self.weekly_calorie_burn_rate.to_d)        end                          def daily_intake         '%.2f' % (self.tdee.to_d - self.daily_calorie_burn.to_d)       end                               def total_grams_of(macro)         self.meal_foods.map(&macro).inject(:+)       end         def pct_fat_satisfied         #how of macro needed?         fat_needed = self.fat_factor * self.current_lbm         #how in meal?         fat_provided = self.total_grams_of(:fat)         #percent needed         pct_fulfilled = fat_provided.to_f/fat_needed.to_f         bigdecimal(pct_fulfilled, 2)*100       end         def pct_protein_satisfied         #how protien needed?         protein_needed = self.protein_factor * self.current_lbm         #how protien provided?         protein_provided = total_grams_of(:protien)         #pct of protien satisfied?         pct_fulfilled = protein_provided.to_f/protein_needed.to_f         bigdecimal(pct_fulfilled, 2)*100       end            def pct_carbs_satisfied         #how many carbs needed?         cals_required = self.tdee.to_f - (self.tdee.to_f * self.deficit_pct.to_f)         fat_cals = total_grams_of(:fat) * 9         protien_cals = total_grams_of(:protien) * 4         #how many carbs provided?         cals_provided = fat_cals + protien_cals         cals_balance = cals_required - cals_provided         carbs_needed = cals_balance/4         carbs_provided = total_grams_of(:carbs)         bigdecimal(carbs_provided / carbs_needed, 2) * 100       end       end 

i've tried resetting database , same issue comes up.


to recap:

it seems status_update being initialized, , initialized version of object available view. attributes initialized ones, why doesn't have id, or timestamp when created... because never created.

however when try access console realized it's giving me 'nil' , predictable values because in console it's looking created , object relationship in relationship.

so more precise question here view returning initialized version of object instead of console returns?

when app hits method within user model throws error because status_update doesn't exist when calls

self.status_updates.first 

you're doing

@status_update = user.status_updates.build 

in controller - pretty common place can put form on page allows user submit new status update.

this object unsaved, so

user.status_updates.count 

which guaranteed hit database (and run select count(*) ...) doesn't count it. in in memory cache of status updates association user , user.status_updates.any? returns true.

you might note it's extremely unidiomatic compare return value of predicate methods true or false. reads funny , methods may return value equivalent truthiness other true or false (for example nil instead of false).


Comments

Popular posts from this blog

SPSS keyboard combination alters encoding -

Add new record to the table by click on the button in Microsoft Access -

CSS3 Transition to highlight new elements created in JQuery -