在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
。
所以,我尝试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问题的人提示,因为这肯定是值得在调试时检查的。
答案 0 :(得分:0)
active_questions_for_standard_and_element
可能确实会返回一个数组,但是通过将[index-1]
应用于它,您将从该数组中获取一个元素。除非您的数组包含子数组,否则您不应期望active_questions_for_standard_and_element(...)[index-1]
生成数组。