How to get records created at the current month?

后端 未结 4 697
小蘑菇
小蘑菇 2021-02-15 18:12

I have a candidate which has_many votes.

I am trying to get the votes of a candidate that were created in the current month?

@candidate.votes.from_this_m         


        
相关标签:
4条回答
  • 2021-02-15 18:28

    You could use an ActiveRecord Association Extension:

    #app/models/Candidate.rb
    Class Candidate < ActiveRecord::Base
       has_many :votes do
           def from_this_month
               where("created_at > ? AND created_at < ?", Time.now.beginning_of_month, Time.now.end_of_month)
           end
       end
    end
    

    This should allow you to call @candidate.votes.from_this_month to return the required conditional data

    0 讨论(0)
  • 2021-02-15 18:38

    You need to enclose the where in a lamda as well.

    scope :from_this_month, lambda { where("votes.created_at > ? AND votes.created_at < ?", Time.now.beginning_of_month, Time.now.end_of_month) }
    

    Otherwise it may appear to work and your tests will all pass, but if your app runs for more than a month you will start to get incorrect results because Time.now is evaluated when the class loads, not when the method is called.

    0 讨论(0)
  • 2021-02-15 18:45
      scope :this_month, -> { where(created_at: Time.zone.now.beginning_of_month..Time.zone.now.end_of_month) }
    

    and you can call the scope:

    Model.this_month

    0 讨论(0)
  • 2021-02-15 18:51

    Correct scope

    scope :from_this_month, lambda {where("votes.created_at > ? AND votes.created_at < ?", Time.now.beginning_of_month, Time.now.end_of_month)}
    

    This is because in rails the model names are singular(i.e Vote) and tables created are pural (e.g. votes) by convection

    EDIT

    This can be written simpler with lambda {where(created_at: Time.now.beginning_of_month..(Time.now.end_of_month))} and we need to use lambda due to the reason given in below comments.

    Thanx BroiSatse for reminding :D

    0 讨论(0)
提交回复
热议问题