2013-10-28 30 views
4

我有一個通過考試,但顯示Rails,防止Model.scoped的棄用警告,find(:all)和relation #all?

$ rspec spec/event_calendar_spec.rb 
......DEPRECATION WARNING: Model.scoped is deprecated. Please use Model.all instead. (called from events_for_date_range at /home/durrantm/Dropbox/96_2013/work/code/ruby/event_calendar/lib/event_calendar.rb:52) 
DEPRECATION WARNING: Calling #find(:all) is deprecated. Please call #all directly instead. You have also used finder options. These are also deprecated. Please build a scope instead of using finder options. (called from events_for_date_range at /home/durrantm/Dropbox/96_2013/work/code/ruby/event_calendar/lib/event_calendar.rb:52) 
DEPRECATION WARNING: Relation#all is deprecated. If you want to eager-load a relation, you can call #load (e.g. `Post.where(published: true).load`). If you want to get an array of records from a relation, you can call #to_a (e.g. `Post.where(published: true).to_a`). (called from events_for_date_range at /home/durrantm/Dropbox/96_2013/work/code/ruby/event_calendar/lib/event_calendar.rb:52) 

的模型是:

50  # Get the events overlapping the given start and end dates 
51  def events_for_date_range(start_d, end_d, find_options = {}) 
52  self.scoped(find_options).find(
53   :all, 
54   :conditions => [ "(? <= #{self.quoted_table_name}.#{self.end_at_field}) AND (#{self.quoted_table_name}.#{self.start_at_field}< ?)", start_d.to_time.utc, end_d.to_time.utc ], 
55   :order => "#{self.quoted_table_name}.#{self.start_at_field} ASC" 
56  ) 
57  end 

我試過幾個品種的去除.scoped,刪除:所有並使用,但在那裏似乎沒有任何工作,爲例如:

50  # Get the events overlapping the given start and end dates 
51  def events_for_date_range(start_d, end_d, find_options = {}) 
52  self.all.where(find_options, 
53   :conditions => [ "(? <= #{self.quoted_table_name}.#{self.end_at_field}) AND (#{self.quoted_table_name}.#{self.start_at_field}< ?)", start_d.to_time.utc, end_d.to_time.utc ], 
54   :order => "#{self.quoted_table_name}.#{self.start_at_field} ASC" 
55  ) 
56  end 

了:

expected: [#<CustomEvent id: 1, custom_start_at: "2013-10-27 13:12:00", custom_end_at: "2013-10-29 13:12:00">] 
     got: #<ActiveRecord::Relation [#<CustomEvent id: 1, custom_start_at: "2013-10-27 17:12:00", custom_end_at: "2013-10-29 17:12 

如何更新查找不顯示過時的警告?

+0

有你嘗試過使用'load'和'all'的答案嗎? – lightswitch05

回答

5

all是隱含的,使用範圍,當你不需要它。

50  # Get the events overlapping the given start and end dates 
51  def events_for_date_range(start_d, end_d, find_options = {}) 
52  self.where(find_options, 
53   :conditions => [ "(? <= #{self.quoted_table_name}.#{self.end_at_field}) AND (#{self.quoted_table_name}.#{self.start_at_field}< ?)", start_d.to_time.utc, end_d.to_time.utc ], 
54   :order => "#{self.quoted_table_name}.#{self.start_at_field} ASC" 
55  ) 
56  end 

你只會用all,如果你真的希望所有的記錄:CustomEvent.all。如果你擔心默認範圍,你可以做這樣的事情:

50  # Get the events overlapping the given start and end dates 
51  def events_for_date_range(start_d, end_d, find_options = {}) 
52  self.unscoped.where(find_options, 
53   :conditions => [ "(? <= #{self.quoted_table_name}.#{self.end_at_field}) AND (#{self.quoted_table_name}.#{self.start_at_field}< ?)", start_d.to_time.utc, end_d.to_time.utc ], 
54   :order => "#{self.quoted_table_name}.#{self.start_at_field} ASC" 
55  ) 
56  end 

如果您在軌道4使用all,以此來迫使預先加載,你現在應該使用load

50  # Get the events overlapping the given start and end dates 
51  def events_for_date_range(start_d, end_d, find_options = {}) 
52  self.where(find_options, 
53   :conditions => [ "(? <= #{self.quoted_table_name}.#{self.end_at_field}) AND (#{self.quoted_table_name}.#{self.start_at_field}< ?)", start_d.to_time.utc, end_d.to_time.utc ], 
54   :order => "#{self.quoted_table_name}.#{self.start_at_field} ASC" 
55  ).load 
56  end