Ruby on rails Rails 3-某些集合上的未定义方法

Ruby on rails Rails 3-某些集合上的未定义方法,ruby-on-rails,arrays,ruby-on-rails-3,activerecord,Ruby On Rails,Arrays,Ruby On Rails 3,Activerecord,我有一个为我的模型链接编写的搜索方法 在实现投票之前,我一直能够毫无错误地调用此方法。例如,这些都可以工作: Link.search(params[:search]) current_user.links.search(params[:search]) current_account.links.search(params[:search]) 以下操作不起作用: @links = current_user.votes.collect {|vote| vote.voteable} @favori

我有一个为我的模型链接编写的搜索方法

在实现投票之前,我一直能够毫无错误地调用此方法。例如,这些都可以工作:

Link.search(params[:search])
current_user.links.search(params[:search])
current_account.links.search(params[:search])
以下操作不起作用:

@links = current_user.votes.collect {|vote| vote.voteable}
@favorites = @links.search(params[:search])
并返回此错误:

 undefined method `search' for #<Array:0x00000006919ac8>
这应该与我的工作示例没有什么不同:

user.links.class
 => Array
user.links.first.class
 => Link
我想可能是因为我调用了数组而不是链接上的搜索。但在前面的例子中,我也在数组中调用它


我使用vote\u fu来处理投票,因此是vote/voteable。

您定义的搜索函数或范围是在Link对象上定义的,可以在Link关系中使用,但它不是在简单数组上定义的,这是从第一个collect示例返回的。这里有一个简单的区别:

class User
  scope :search, lambda{ |name| where(name: name) }
end

User.search('Kombo').all # Returns an array of the SQL result run against the DB
User.all.search('Kombo') # NoMethodError: undefined method `search' for #<Array:0x000001079b15b0>
当您调用
.collect
时,您隐式调用了
.all
,这打破了范围链。以下两个命令在这方面是等效的:

@links = current_user.votes.collect {|vote| vote.voteable}
@links = current_user.votes.all.collect {|vote| vote.voteable}

这是有道理的。我真的很感谢今天下午的帮助。我认为可能是这样的,但当我在控制台中对.class产生相同的响应时,我对自己的测试感到困惑。我真的很感激,我想有了这一点知识,我就能让这件事顺利进行:)。你的理解力很强。对于任何发现这一点并需要完整答案的人。我听了潘的话,从选票中找到了一个集合,然后用links.search找到了另一个集合。然后我将两个数组相交。这似乎不是完全正确的,因为我正在查看一个代码库,其中它们调用类似于
Link.all.search(params[:search])
。运行scope方法之前的类型是类型Array。你知道这是怎么回事吗?我必须从Rails中提取部分代码库,并使用已定义范围的模型中的一些功能。我知道它应该是ActiveRecord::Relation,但这不是类型。
Link.search(params[:search]) # will work
Link.all.search(params[:search]) # will not work

current_user.links.search(params[:search]) # will work
current_user.links.all.search(params[:search]) # will not work

current_account.links.search(params[:search]) # will work
current_account.links.all.search(params[:search]) # will not work
@links = current_user.votes.collect {|vote| vote.voteable}
@links = current_user.votes.all.collect {|vote| vote.voteable}