2012-09-24 10 views
6

İlgili Kod: http://pastebin.com/EnLJUJ8GRaylar 3: Bir nesneyi sonradan bir geri aramada açıkça kaydetmeliyim mi?

class Task < ActiveRecord::Base 
    after_create :check_room_schedule 

    ... 

    scope :for_date, lambda { |date| where(day: date) } 
    scope :for_room, lambda { |room| where(room: room) } 

    scope :room_stats, lambda { |room| where(room: room) } 
    scope :gear_stats, lambda { |gear| where(gear: gear) } 

    def check_room_schedule 
    @tasks = Task.for_date(self.day).for_room(self.room).list_in_asc_order 
    @self_position = @tasks.index(self) 

    if @tasks.length <= 2 
     if @self_position == 0 
     self.notes = "There is another meeting in 
    this room beginning at # {@tasks[1].begin.strftime("%I:%M%P")}." 
     self.save 
     end 
    end 
    end 

    private 

    def self.list_in_asc_order 
     order('begin asc') 
    end 
end 

Ben küçük bir görev app yapıyorum. Her görev bir odaya atanır. Bir görev ekledikten sonra, eklediğim görevden önce ve sonra aynı odada görevler olup olmadığını kontrol etmek için bir geri arama kullanmak istiyorum (kodum sadece şu anda bir kenar durumu ele alsa da).

Bu yüzden after_create'i kullanmaya karar verdim (kullanıcı bunu düzenlediklerinde bunu manuel olarak kontrol edecek, dolayısıyla after_save yapamayacaktır), böylece o gün, odadaki görevleri sorgulamak için iki kapsam ve bir sınıf yöntemini kullanabilirdim ve bunları zamana göre sıralayın. Ardından dizideki nesneyi bulup ifadeler kullanıp kullanmaya başladım.

Nesneyi açıkça kaydetmem gerekiyor. İşe yarıyor. Ama bunu yapmam garip geliyor. Ben çok deneyimli (ilk uygulama) değilim, bu yüzden bu çatık olup olmadığından emin değilim ya da kongre ise. Bir demet aradım ve bir referans kitabını inceledim, ancak bu özel bir şey görmedim.

Teşekkürler.

cevap

3

Bu bana before_create için bir görev gibi görünüyor. Eğer after_* geri aramada kaydetmek zorunda kalırsanız, büyük olasılıkla bunun yerine bir before_* geri dönüşümü kullanmış olmalısınız. Geri çağırma kodu sizin için çalıştıktan sonra kayıt gerçekleştiğinden, numaralı telefonu aramanız gerekmeyecektir.

Kaydetmek yerine, 2 veya daha fazla nesne döndürüp döndürmediğinizi görmek için sorgulamayı kaydetmek yerine, kaydetmeden önce çakışacak bir nesne için sorgulama yapmalısınız.

after creation 
    now that I'm saved, find all tasks in my room and at my time 
    did I find more than one? 
    Am I the first one? 
     yes: add note about another task, then save again 
     no: everything is fine, no need to re-save any edits 

sahip gerekenler:: Bunlar gibi

before creation 
    is there at least 1 task in this room at the same time? 
    yes: add note about another task 
    no: everything is fine, allow saving without modification 

şey:

before_create :check_room_schedule 
def check_room_schedule 
    conflicting_task = Task.for_date(self.day) 
         .for_room(self.room) 
         .where(begin: self.begin) # unsure what logic you need here... 
         .first 
    if conflicting_task 
    self.notes = 
     "There is another meeting in this room beginning at #{conflicting_task.begin.strftime("%I:%M%P")}." 
    end 
end 
+0

kapsamları yük olmaz beri artık ne psuedo kodunda

, Bu nesne (veya bu konuda yanlış mıyım?), bu nesneyi el ile @tasks dizisine eklemem gerekiyor, düzeltilsin mi? – douglas

+0

Düzenlememe bakın. Kaydetmeden önce sorgunuzun 2 veya daha fazla nesne döndürüp döndürmediğini görmek yerine, kaydetmeden önce temel olarak 1 çakışma olup olmadığını kontrol edin. –

+0

Veritabanında bir kaydın kontrol edilmesi ActiveRecord bulucu metodu var "?" Kullanılmalıdır. [Active Record API Dock] 'a bakın (http://apidock.com/rails/ActiveRecord/FinderMethods/exists%3F) – unnu