ActiveRecord“where”产生的不同对象比“pluck”

时间:2013-03-17 19:05:02

标签: ruby-on-rails object activerecord lazy-loading where

我需要消除这个过程中的一个步骤。

我首先使用“where”查找匹配id的个人资料

@facebook_profile = FacebookProfile.where(:facebook_id => session[:facebook_profile_id])

生成一个看起来像这样的对象(注意周围的方括号)

[#<FacebookProfile id: 94, etc.]

如果我这样做:

$ @facebook_profile.id

结果是

#<NoMethodError: undefined method `id' for #<ActiveRecord::Relation:0x007f919cb0b3c0>>

然后我使用pluck来生成一个不同的对象,但这要求我使用前面的关系@facebook_profile。

@new_facebook_profile = FacebookProfile.find_by_my_column(@facebook_profile.pluck(:my_column))

这产生了一个没有方括号的关系:

#<FacebookProfile id: 94, etc.>

在这个对象上,我可以打电话:

@new_facebook_profile.id

并获得正确的结果

我怎么能做@ facebook_profile.id并获得正确的结果而不是错误?我怀疑这与延迟加载有关,但我不能确定。我知道它与关系周围的括号有关。我想摆脱“采摘”步骤。

2 个答案:

答案 0 :(得分:1)

尝试使用:

@facebook_profile = FacebookProfile.where(:facebook_id => session[:facebook_profile_id]).first

然后您可以直接使用@facebook_profile.id

#first调用实际执行where()关系描述的查询,限制为1,并返回匹配的记录(如果有)。

答案 1 :(得分:1)

从错误中可以看出,where不会返回单个对象,而是返回符合您指定条件的可枚举对象集合。这就是对象上不存在id方法的原因。

您可以将.first追加到@facebook_profile = FacebookProfile.where(:facebook_id => session[:facebook_profile_id])的末尾,以达到您想要的效果。