मैं तिथि के अनुसार नियुक्तियों की एक सूची कैसे समूहित करूं? - रूबी, रूबी-ऑन-रेल -3, एक्टिव्रेकॉर्ड

मैं नियुक्तियों की एक सूची वापस कर रहा हूँ।

अभी वे इस तरह दिखते हैं:

-Jan 1
--appointment @230
-Jan 1
--appointment @3
-Jan 1
--appointment @4
-Jan 2
--appointment @4
-Jan 2
--appointment @5

मैं इस तरह की सूची वापस करना चाहता हूं

-Jan 1
--appointment @230
--appointment @3
--appointment @4
-Jan 2
--appointment @4
--appointment @5

नियुक्तियों में "start_at" फ़ील्ड होता है जो डेटटाइम होता है। अपेक्षाकृत सरलता से। जूट यह सुनिश्चित नहीं करते कि संग्रह पर पुन: प्रयास कैसे करें और फिर इसे सबसे अच्छे तरीके से समूहीकृत करें।

धन्यवाद।

उपयोगकर्ता (एक उपयोगकर्ता या ट्रेनर है) has_many: नियुक्तियां has_many: trainer_appointments, class_name => "नियुक्ति",: foreign_key => "trainer_id"

नियुक्ति

# Table name: appointments
#
#  id         :integer          not null, primary key
#  trainer_id :integer
#  start_at   :datetime
#  created_at :datetime         not null
#  updated_at :datetime         not null
#  user_id    :integer

यहां कुछ प्ले कोड है: u.trainer_appointments

=> [#<Appointment id: 6, trainer_id: 1, start_at: "2012-11-18 13:08:00", created_at: "2012-10-17 02:01:42", updated_at: "2012-10-17 02:01:42", user_id: 2>, #<Appointment id: 7, trainer_id: 1, start_at: "2012-11-18 13:08:00", created_at: "2012-10-17 02:02:00", updated_at: "2012-10-17 02:02:00", user_id: 2>, #<Appointment id: 8, trainer_id: 1, start_at: "2012-11-24 13:08:00", created_at: "2012-10-17 02:03:28", updated_at: "2012-10-17 02:03:28", user_id: 2>]

3 नियुक्तियां देता है। दो उसी दिन हैं। 1 एक अलग दिन पर।

इसे उस तरह से वापस करना चाहूंगा जहां इसे एक तिथि से समूहीकृत किया गया हो। मैंने इसे समझने के लिए कुछ ऐसा करने की कोशिश की लेकिन खो गया:

u.trainer_appointments.collect {|each| each.start_at}.uniq.collect {|each| u.trainer_appointments.find_by_start_at(each.to_date.beginning_of_day..each.to_date.end_of_day)}

जो दो नियुक्तियों को वापस कर दिया। दोनों तिथियों के बीच। पहले दिन को 2 गुम है।

मुझे पता है कि कोड इतने सारे स्तरों पर गलत है।मैं बस पुनरावृत्ति के साथ खिलौना करने की कोशिश कर रहा था। हालांकि मैं जो चाहता था उसे प्राप्त नहीं किया था। शायद क्योंकि यूनिक किसी भी तरह से रिटर्न आकार को सीमित करता है, भले ही मैं अंतिम सरणी में एक रेंज वापस लौटने की उम्मीद कर रहा था।

मुझे यकीन नहीं है कि ग्रुपिंग में मुझे किस वास्तविक संरचना की आवश्यकता है। यह मेरी विशेषज्ञता नहीं है। एक सरणी के अंदर एक सरणी समूहित? मैं इसे एक दृश्य में कैसे फिर से शुरू करूंगा?

धन्यवाद।

उत्तर:

जवाब के लिए 2 № 1

उपयोगकर्ता group_by आपके संग्रह पर

The रूबी कार्यांवयन इसे में पारित अभिव्यक्ति की आवश्यकता है एक बूलियन को मूल्यांकित करता है ।

The रेल कार्यांवयन आप एक कॉलम में पारित करने की अनुमति देता है और यह उस कॉलम द्वारा समूह ।

आपका कोड इस तरह दिखना चाहिए

u.trainer_appointments.
collect {|a| a.start_at}.
uniq.collect {|b|
u.trainer_appointments.
group_by(b.to_date.beginning_of_day..b.to_date.end_of_day)
}

बदलने के find_by_start_at साथ में group_by

संपादित करें: यह Scoping!

# in User model (or the model for current_user)
class User < ActiveRecord::Base
scope :mine, where(:trainer_id => current_user)
scope :days!, where(:start_at.to_date.beginning_of_day)
# the ! is there because "days" is a Ruby method
end

# in controller...
@client_appointments = @client.appointments.mine.group_by(&:days!)

नोट: मैं कुछ नहीं कर रहा हूं अगर यह "s group_by(days!), group_by(:days!) या group_by(&:days!). आप इसके साथ खेलने के लिए क्या आप के लिए काम करता है देखने के लिए हो सकता है ।


जवाब के लिए 2 № 2

यदि आप डेटाबेस की समूहीकरण सुविधाओं का उपयोग नहीं कर रहे हैं, तो सबसे आसान तरीका खंड का उपयोग करना है:

require "date"

# Make some test data
Appointment = Struct.new(:start_at)
data = ["2012-01-01 14:30", "2012-01-01 15:00", "2012-01-01 16:00",
"2012-01-02 16:00", "2012-01-02 17:00"]

appointments = data.map do |time|
Appointment.new DateTime.parse(time)
end

# Use chunk to group array elements
appointments.
sort { |a,b| b.start_at <=> a.start_at }. # always sort before chunking
chunk { |appt| appt.start_at.to_date }. # chunk on day of the appointment
each do |day, appts| # chunk emits two-element arrays
puts
puts "Day " + day.to_s
appts.each { |appt| puts appt.start_at.strftime("%H:%M") }
end

आउटपुट:

Day 2012-01-02
17:00
16:00

Day 2012-01-01
16:00
15:00
14:30

जवाब के लिए 0 № 3

निम्नलिखित का उपयोग करके समाप्त हुआ:

    @client_appointments = @client.appointments.find(:all, :conditions => {:trainer_id => current_user}).group_by {|a| a.start_at.to_date.beginning_of_day }

और उसके बाद इसे फिर से शुरू करना:

- @client_appointments.sort.each do |month, appointments|
%h2
= month.to_s(:day_month)
= render appointments

संबंधित सवाल
सबसे लोकप्रिय