为什么我的方法会改变它正在处理的变量的类型?我怎么能阻止它?

时间:2013-08-28 01:14:33

标签: ruby-on-rails ruby memcached

product.rb中,我有:

  def active_question_description_for_standard_element_and_index(standard, element, index)
    active_questions_for_standard_and_element(standard, element)[index-1].try(:description)
  end

  def active_questions_for_standard_and_element(standard, element)
    Rails.cache.fetch([self, standard, element, "product_active_questions_for_standard_and_element"]) {
      questions_for_standard_and_element(standard, element).select{|q| q.active}}
  end

active_question_description_for_standard_element_and_index方法给了我这个错误:NoMethodError: undefined method 'description' for 0:Fixnum

因此,我从self.touch开始绕过缓存,然后输入active_questions_for_standard_and_element(standard, element)。这将返回0

“嗯,”我想,“这意味着返回一个数组,即使它是一个空数组。它并不意味着返回一个Fixnum。”

所以,我尝试questions_for_standard_and_element(standard, element).select{|q| q.active},然后返回[],就像你期望的那样。

那么,为什么Rails会将[]转换为0?而且,我怎么能阻止它?

更新

似乎问题与Rails.cache有关,因为当我从方法中删除它时一切正常。到目前为止,我不知道问题是什么,因为将[]写入缓存工作正常;再次回读时它不会转换为0

[1] pry(main)> Rails.cache.write('foo', [])
Cache write: foo
Dalli::Server#connect 127.0.0.1:11211
=> true
[2] pry(main)> Rails.cache.read('foo')
Cache read: foo
=> []

更新2:找到答案

另一种方法是写入相同的缓存键。将此声音留给任何有Rails.cache问题的人提示,因为这肯定是值得在调试时检查的。

1 个答案:

答案 0 :(得分:0)

active_questions_for_standard_and_element可能确实会返回一个数组,但是通过将[index-1]应用于它,您将从该数组中获取一个元素。除非您的数组包含子数组,否则您不应期望active_questions_for_standard_and_element(...)[index-1]生成数组。