এর মধ্যে রেলস অ্যাক্টিভেকর্ডের তারিখ


171

আমার একদিনে করা মন্তব্যগুলি জিজ্ঞাসা করা দরকার। ক্ষেত্রটি স্ট্যান্ডার্ড টাইমস্ট্যাম্পগুলির অংশ created_at। নির্বাচিত তারিখটি এ থেকে আসছে date_select

আমি কীভাবে এটি ব্যবহার ActiveRecordকরতে পারি?

আমার মতো কিছু দরকার:

"SELECT * FROM comments WHERE created_at BETWEEN '2010-02-03 00:00:00' AND '2010-02-03 23:59:59'"

উত্তর:


402

কেবলমাত্র একটি নোট যে বর্তমানে গৃহীত উত্তরগুলি রেল ৩. এ অবনতিযুক্ত রয়েছে আপনার পরিবর্তে এটি করা উচিত:

Comment.where(:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day)

বা, আপনি যদি চান বা খাঁটি স্ট্রিং শর্তাদি ব্যবহার করতে চান তবে আপনি এটি করতে পারেন:

Comment.where('created_at BETWEEN ? AND ?', @selected_date.beginning_of_day, @selected_date.end_of_day)

9
ডে.ইহোয়ার (: রেফারেন্স_ডেট => 6.মেনথস.গো..টাইম.নো) কাজ করে, ধন্যবাদ
বোল্ডার_রুবি

4
এটি কি একটি বিশাল পরিসীমা অবজেক্ট তৈরি করবে না?
ক্যাস্পার গ্রুবে

3
@ ক্যাস্পার গ্রুবে যদি আপনি নিজেই এই ব্যাপ্তিটি ব্যবহার করেন তবে তা রেলগুলি কেবল প্রথম এবং শেষ মানগুলি ব্যবহার করে
ডেক্স

4
@ ক্যাস্পার গ্রুবে @Dex- এটি রেল নয় যা এটি করে। রুবির রেঞ্জ শ্রেণি কেবলমাত্র নিম্ন এবং উপরের সীমানা সংরক্ষণ করে। এটি আইআরবিতে দুর্দান্তভাবে চালিত হয়: 1..1000000000000'নিজের দ্বারা পরিসরটি ব্যবহার করে' আপনি কী বোঝাতে চেয়েছিলেন তা সম্পর্কে আমি অস্পষ্ট
কনার ক্লার্ক

11
+1 আমরা এটিকে একটি সুযোগও তৈরি করতে পারি: scope :between, -> (a, b) { where(created_at: a..b) }

48

আমি ব্যক্তিগতভাবে এটিকে আরও পাঠযোগ্য ও পুনরায় ব্যবহারযোগ্য করে তোলার সুযোগ তৈরি করব:

আপনি কমেন্ট.আরবিতে আপনি একটি ব্যাপ্তি নির্ধারণ করতে পারেন:

scope :created_between, lambda {|start_date, end_date| where("created_at >= ? AND created_at <= ?", start_date, end_date )}

তারপরে কোয়েরিটির মধ্যে তৈরি:

@comment.created_between(1.year.ago, Time.now)

আশা করি এটা সাহায্য করবে.


4
খুব পরিষ্কার পদ্ধতির ... নিখুঁত !!
জোসেফ এন।

এই উত্তরটির উপরে ফিরে যান কারণ আমি এই খুব ইস্যুটি অনুসন্ধান করেছি। সিনট্যাক্সে ভুলভাবে অনুমান করা হয়েছে, ধরে নেওয়া হয়েছে এমন #between?একটি ব্যাপ্তি রয়েছে।
তাস

28

রেল 5.1 একটি নতুন তারিখ সহায়ক পদ্ধতি প্রবর্তন করেছে all_day, দেখুন: https://github.com/rails/rails/pull/24930

>> Date.today.all_day
=> Wed, 26 Jul 2017 00:00:00 UTC +00:00..Wed, 26 Jul 2017 23:59:59 UTC +00:00

আপনি যদি রেল 5.1 ব্যবহার করেন তবে ক্যোয়ারীটি এমন দেখাচ্ছে:

Comment.where(created_at: @selected_date.all_day)

1
মহিমান্বিত। এটি আসলে অ্যাকটিভসপোর্ট রত্নটির অংশ (এবং পরবর্তীকালে পুরো অ্যাক্টিভেকর্ড ইকোসিস্টেম), তাই এটিও রেলের বাইরেও কাজ করে! শুধু require 'active_record'এবং আপনি প্রস্তুত!
মাস্টার অব ডাকস

24

এই কোডটি আপনার পক্ষে কাজ করা উচিত:

Comment.find(:all, :conditions => {:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day})

আরও তথ্যের জন্য সময় গণনা একবার দেখুন

দ্রষ্টব্য: এই কোডটি অবচিত করা হয়েছে । উত্তরটি থেকে কোডটি ব্যবহার করুন যদি আপনি রেল ৩.১ / ৩.২ ব্যবহার করছেন


ঠিক আছে তবে ফর্মটি থেকে আমি এটি পেয়েছি: written "লিখিত_এট (4 আই)" => "18", "লিখিত_আট (5 আই)" => "56", "সামগ্রী" => "ররর্র", "লিখিত_আট (1 আই)" = > "2010", "লিখিত_আট (2 আই)" => "5", "লিখিত_আট (3 আই)" => "4" beginning আমি কীভাবে শুরু_আর_দিন ব্যবহার করার জন্য একটি অবজেক্ট তৈরি করতে পারি?
rtacconi

এটি আমার দরকার: purab.wordpress.com/2009/06/16/…
rtacconi

2
আমি গ্রহণযোগ্য উত্তরের চেয়ে এই পদ্ধতিটি পছন্দ করি কারণ এটি কোনও ডিবি-স্তরের date()ফাংশনের উপর নির্ভর করে না ; এটি সম্ভবত আরও ডিবি স্বাধীন।
ক্রেগ ওয়াকার

10

পরীক্ষিত উত্তরটি কাজ করেছে কিনা তা দেখার জন্য আমি এই কোডটি চালিয়েছি এবং এটি সঠিক হওয়ার জন্য তারিখের চারপাশে অদলবদল করতে হবে। এই কাজ -

Day.where(:reference_date => 3.months.ago..Time.now).count
#=> 721

যদি আপনি ভাবছেন যে আউটপুটটি 36 হওয়া উচিত ছিল, স্যার, এটি বিবেচনা করুন 3 জন থেকে 3 দিন কত দিন?



5

আমি 2 এর পরিবর্তে 3 টি বিন্দু ব্যবহার করছি, তিনটি বিন্দু আপনাকে এমন একটি পরিসীমা দেয় যা শুরুতে খোলা থাকে এবং শেষে বন্ধ থাকে, সুতরাং যদি আপনি পরবর্তী রেঞ্জগুলির জন্য 2 টি অনুসন্ধান করেন তবে আপনি একই সারিটি ফিরে পেতে পারবেন না উভয়।

2.2.2 :003 > Comment.where(updated_at: 2.days.ago.beginning_of_day..1.day.ago.beginning_of_day)
Comment Load (0.3ms)  SELECT "comments".* FROM "comments" WHERE ("comments"."updated_at" BETWEEN '2015-07-12 00:00:00.000000' AND '2015-07-13 00:00:00.000000')
=> #<ActiveRecord::Relation []> 
2.2.2 :004 > Comment.where(updated_at: 2.days.ago.beginning_of_day...1.day.ago.beginning_of_day)
Comment Load (0.3ms)  SELECT "comments".* FROM "comments" WHERE ("comments"."updated_at" >= '2015-07-12 00:00:00.000000' AND "comments"."updated_at" < '2015-07-13 00:00:00.000000')
=> #<ActiveRecord::Relation []> 

এবং, হ্যাঁ, একটি সুযোগ ব্যবহার করতে সর্বদা চমৎকার!


4

আপনি যদি কেবল একদিন পেতে চান তবে এইভাবে আরও সহজ হবে:

Comment.all(:conditions => ["date(created_at) = ?", some_date])

4

বিভিন্ন উপায় আছে। আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন:

start = @selected_date.beginning_of_day
end = @selected_date.end_of_day
@comments = Comment.where("DATE(created_at) BETWEEN ? AND ?", start, end)

অথবা এটা:

@comments = Comment.where(:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day)

4

আমি এই গণনায় একটি ডিফল্ট সক্রিয় রেকর্ড আচরণ থাকতে হবে। তারিখগুলি জিজ্ঞাসা করা শক্ত, বিশেষত যখন সময় অঞ্চলগুলি এতে জড়িত থাকে।

যাইহোক, আমি ব্যবহার:

  scope :between, ->(start_date=nil, end_date=nil) {
    if start_date && end_date
      where("#{self.table_name}.created_at BETWEEN :start AND :end", start: start_date.beginning_of_day, end: end_date.end_of_day)
    elsif start_date
      where("#{self.table_name}.created_at >= ?", start_date.beginning_of_day)
    elsif end_date
      where("#{self.table_name}.created_at <= ?", end_date.end_of_day)
    else
      all
    end
  }

1

আপনি তারিখগুলির মধ্যে রেকর্ডগুলি সন্ধান করতে রত্নের নীচে ব্যবহার করতে পারেন,

এই রত্নটি ব্যবহার করা বেশ সহজ এবং আরও স্পষ্ট তারা এই রত্নটি ব্যবহার করছেন এবং এপিআই আরও স্পষ্ট এবং ডকুমেন্টেশনও ভালভাবে ব্যাখ্যা করেছেন।

Post.between_times(Time.zone.now - 3.hours,  # all posts in last 3 hours
                  Time.zone.now)

এখানে আপনি আমাদের ক্ষেত্রটি পাস করতে পারে Post.by_month("January", field: :updated_at)

ডকুমেন্টেশন দেখুন এবং এটি চেষ্টা করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.