Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails从.find(:id)和.where()方法创建的对象的差异_Ruby On Rails - Fatal编程技术网

Ruby on rails Rails从.find(:id)和.where()方法创建的对象的差异

Ruby on rails Rails从.find(:id)和.where()方法创建的对象的差异,ruby-on-rails,Ruby On Rails,使用这两种方法创建的对象有什么区别: tec = Technique.find(6) tec2 = Technique.where(:korean => 'Jok Sul') 为每个对象返回的数据完全相同,但是第一个对象将完全响应继承的方法,如update_attributes,而第二个对象将给出method not found错误 当我执行tec.class和tec2.class时,一个是ActiveRecord::Relation,另一个根本没有给我类,它只是打印出对象的内容 也许当

使用这两种方法创建的对象有什么区别:

tec = Technique.find(6)
tec2 = Technique.where(:korean => 'Jok Sul')
为每个对象返回的数据完全相同,但是第一个对象将完全响应继承的方法,如update_attributes,而第二个对象将给出method not found错误

当我执行tec.class和tec2.class时,一个是ActiveRecord::Relation,另一个根本没有给我类,它只是打印出对象的内容

也许当您使用.where方法时,您会得到一个数组,即使只有一个匹配,因此您总是必须发出.each方法来获取内容?但是当你想更新记录时,这就很难处理了

有人能帮我澄清一下吗?特别是,如何处理通过.where方法找到的匹配项

谢谢

试试看:

tec2 = Technique.where(:korean => 'Jok Sul').first
尝试:

find(6)
返回单个对象,因为您在数据库中指定了对象ID,按照惯例,该ID是唯一的

where
调用返回一个集合,该集合可能只有一个项目长,但它仍然返回一个集合,而不是单个对象

你可以揭示这种差异。使用您的示例代码,如果您调用
tec.class
vs.
tec2.class
,我想您会发现它们不是您所期望的同一类对象

也就是说,对象集合可用的方法不同于该对象实例上可用的方法。

查找(6)返回单个对象,因为您在数据库中指定了对象ID,按照惯例,该ID是唯一的

where
调用返回一个集合,该集合可能只有一个项目长,但它仍然返回一个集合,而不是单个对象

你可以揭示这种差异。使用您的示例代码,如果您调用
tec.class
vs.
tec2.class
,我想您会发现它们不是您所期望的同一类对象

也就是说,对象集合可用的方法不同于该对象实例可用的方法。

好问题

tec_scope = Technique.where(:korean => 'Jok Sul') # create an internal query
请记住,这里只创建查询,不执行查询。如果愿意,您可以通过编程方式在此查询之上构建。范围(或查询,如果您愿意)将以两种方式执行。“隐式”或“显式”。运行查询的隐式方式发生在控制台中,控制台调用作用域上的方法,该方法自动为您运行查询。这不会发生在你的控制器中,除非你明确地运行它

tec_scope.all # returns array
tec_scope.first # retuns one element
作用域只是将where子句/谓词添加到查询中。它是查询构建,并将执行延迟到需要时

但是,

tec_objects = Technique.find(6) # explicitly runs a query and returns one object (in this case)
这将在那里显式地运行查询,然后执行。这是一个查询执行时间的问题

这种差别很微妙,但非常重要

这与是否得到一个结果或数组无关

Technique.find([4,5]) # will return an array
Technique.find(4) # will return one object
Technique.where(:some_key => "some value").all # will return an array
Technique.where(:id => 5).first # will return one object
不同之处在于执行查询的时间。不要让控制台欺骗你,让你相信没有区别。Console正在为您隐式启动查询:)

问得好

tec_scope = Technique.where(:korean => 'Jok Sul') # create an internal query
请记住,这里只创建查询,不执行查询。如果愿意,您可以通过编程方式在此查询之上构建。范围(或查询,如果您愿意)将以两种方式执行。“隐式”或“显式”。运行查询的隐式方式发生在控制台中,控制台调用作用域上的方法,该方法自动为您运行查询。这不会发生在你的控制器中,除非你明确地运行它

tec_scope.all # returns array
tec_scope.first # retuns one element
作用域只是将where子句/谓词添加到查询中。它是查询构建,并将执行延迟到需要时

但是,

tec_objects = Technique.find(6) # explicitly runs a query and returns one object (in this case)
这将在那里显式地运行查询,然后执行。这是一个查询执行时间的问题

这种差别很微妙,但非常重要

这与是否得到一个结果或数组无关

Technique.find([4,5]) # will return an array
Technique.find(4) # will return one object
Technique.where(:some_key => "some value").all # will return an array
Technique.where(:id => 5).first # will return one object

不同之处在于执行查询的时间。不要让控制台欺骗你,让你相信没有区别。Console正在隐式地为您触发查询:)

实际上,where方法返回的是ActiveRelation而不是Collection感谢您的解释,我将下面的一个标记为答案,因为它实际上演示了如何处理它,以便我可以使用与.find()相同的方法,where方法返回一个ActiveRelation而不是collection感谢您的解释,我将下面的一个标记为答案,因为它实际上说明了如何处理它,以便我可以使用与.find()相同的方法。太好了,我从来没有想到过这一点。这实际上只返回一个项,并将响应与.find will相同的方法。谢谢,太好了,我从没想过。这实际上只返回一个项,并将响应与.find will相同的方法。谢谢。@kakubei我以为你想知道在哪里找到和在哪里找到的区别。我不知道你只是想知道在哪里(条件)。首先:)@aditya我想要两个,所以现在我很高兴,你的解释很好。第一个很好。@kakubei我以为你想知道在哪里和找到的区别。我不知道你只是想知道在哪里(条件)。首先:)@aditya我两个都想要,所以现在我很高兴,你的解释很好。第一个效果很好。