未定义的方法,其中#<array:0x007fd619b022b8>

时间:2017-12-11 16:48:59

标签: ruby-on-rails ruby

我正在尝试从缓存的数组中选择一个元素,但它不起作用。我正在做以下事情:

> t=Task.last
=> #<Task id: 26, title: "Soloff" created_at: "2017-12-11 13:48:17", updated_at: "2017-12-11 15:57:12"> 
> t.cached_reminds 
 => [#<TaskRemind id: 3, deleted_state: false, task_id: 26, user_id: 1, date: "2017-12-27 23:00:00", created_at: "2017-12-11 16:28:34", updated_at: "2017-12-11 16:28:34">, #<TaskRemind id: 2, deleted_state: false, task_id: 26, user_id: 1, date: "2017-12-28 23:00:00", created_at: "2017-12-11 16:27:16", updated_at: "2017-12-11 16:27:16">] 

所以我的请求呈现了良好的数组,但之后,当我尝试运行时:

t.cached_reminds.where(user_id: 1)

无法识别的行动

你可以帮我吗?

编辑:

形成我的模型任务:

def cached_reminds
  Rails.cache.fetch([self, "task_reminds"]) {task_reminds.to_a}
end

奇怪的是,当我尝试跑步时:

t.task_reminds.where(user_id: 1)

它正在工作!!

2 个答案:

答案 0 :(得分:3)

您可以在块中返回缓存的task_reminds,而无需将其转换为数组,这样它就会为您提供TaskRemind::ActiveRecord_Associations_CollectionProxy个对象,并且您可以使用{ {1}}。与使用数组不同,您必须使用某些东西来过滤其中的元素:

where

答案 1 :(得分:1)

您的cached_reminds似乎是一个记录数组,因此您无法使用ActiveRecord的查询方法where

对于ruby的数组,您可以使用select {}与AR where类似。注意传递给方法

的块
t.cached_reminds.select { |cached| cached.user_id == 1 }
#=> An array of TaskRemind records or empty array

有关详情,请参阅Array#select {}