2011-05-14 51 views
0

我有一個叫RaceWeek的模型。兩個操作我想執行:Rails 2.3.9 - scope,delete_all,update_all

(1)我想範圍下使用此條件的記錄:

"start_date <= #{Time.now} AND end_date >= #{Time.now} AND recordable_type != 'User'" 

然後我想刪除所有記錄。下面是我現在想要的:

RaceWeek.delete_all("start_date <= #{Time.now} AND end_date >= #{Time.now} AND recordable_type != 'User'") 

(2)刪除所有這些之後,我想要重置其餘記錄的值。下面是我努力做,現在:

RaceWeek.find(:all, :conditions => ["start_date <= #{Time.now} AND end_date >= #{Time.now}"]).update_all("games_won = 0, games_lost = 0") 

沒有進入我正在運行到的所有問題,你能解釋一下你怎麼通常執行這些類型的操作?

回答

0

我想我明白你想要做什麼..但我認爲有更好的方法可以接近它。我不知道你在做什麼,所以你可能可以用更合適的東西替換以下named_scope名稱上下文的,但如果你有這樣的事情:

#Your RaceWeek Model 
class RaceWeek < ActiveRecord::Base 

named_scope :started_before_and_ended_after_today, :conditions => ["start_date <= #{Time.now} AND end_date >= #{Time.now}"] 

named_scope :not_recordable_user, :conditions => ["recordable_type != 'User'"] 

end 
在你的任何控制器

現在,而不必每次都寫出來是這樣的:

RaceWeek.find(:all, :conditions => ["start_date <= #{Time.now} AND end_date >= #{Time.now} AND recordable_type != 'User'"]) 

你可以隨便寫的東西更清潔這樣的:

RaceWeek.started_before_and_ended_after_today.not_recordable_user.find(:all) 

所以現在你可以鏈named_隨時隨地合作。但是,看起來你正在嘗試做一些合理的重複操作,而不是每次在你想要使用它的每個控制器中寫出這些內容,只需在你的RaceWeek模型上創建一個「類方法」來爲你做。每當你需要刪除一切,只更新留在剩餘的記錄

#Your RaceWeek Model 
class RaceWeek < ActiveRecord::Base 

named_scope :started_before_and_ended_after_today, :conditions => ["start_date <= #{Time.now} AND end_date >= #{Time.now}"] 

named_scope :not_recordable_user, :conditions => ["recordable_type != 'User'"] 

def self.reset_records 
    started_before_and_ended_after_today.not_recordable_user.delete_all 
    started_before_and_ended_after_today.each { |record| record.update_attributes(:games_won => 0, :games_lost => 0)}  
end 

end 

現在:下面的模型可以refractored了很多得更爲出色,但希望這將讓你開始。所有你需要做的就是打電話:

RaceWeek.reset_records 
+0

完美!非常感謝 – keruilin 2011-05-15 03:32:10