试图在ActiveRecord :: Relation,Arel异常上调用find_by_id

时间:2011-06-07 14:16:22

标签: ruby ruby-on-rails-3 activerecord arel

我正在处理Rails 3,我似乎无法从结果集中进行基本查找。我的代码如下所示:

@project = 
   @user.where({:projects => {:project_member_id => user.id}}).find_by_id(params[:id])

我理解“where”部分不会返回集合,只是创建一个等待对db运行的查询。但是,当我尝试运行find_by_id时,我无法理解为什么会出现以下错误:

undefined method `to_sql' for #<Arel::Attributes::String:0x106d9ecf0>

有人可以指出我出错的地方吗?

5 个答案:

答案 0 :(得分:0)

可能你可以这样写:

@project = 
   @user.where({:projects => {:project_member_id => user.id}}).where(:id => params[:id])

我认为它会奏效。

亚历。

答案 1 :(得分:0)

我可能会误解你在这里尝试做什么,但看起来你在用户模型中有一个名为projects的关联,对吧?如果是这样,这更简单(并且有效):

@project = @user.projects.find params[:id]

如果您没有关联设置,则应该查看它们。关于这个主题有一个很棒的导轨here

我希望这会有所帮助。

答案 2 :(得分:0)

如上所述,“where”将返回ActiveRecord :: Relation对象,您可以通过运行来检查它:

@project = 
   @user.where({:projects => {:project_member_id => user.id}}).class

为了返回实例化对象的集合并运行find,您可以尝试通过运行类似的方式强制它:

@project = 
   @user.where({:projects => {:project_member_id => user.id}}).all.find_by_id(params[:id])

Rails中的爱方法链接!

然而,这首先会找到所有通过uesr.id的项目(这可能代价很高,而且可能不是你想要的)......

祝你好运!

答案 3 :(得分:0)

尝试

@project = 
   @user.where({:projects => {:project_member_id => user.id}}).where(:id => params[:id]).first

但是我不明白为什么当你拥有主键时你正在做这些事情。我认为Model.find params[:id]已经足够了(我认为还有更多内容)。

答案 4 :(得分:0)

试试这个:

@project = @user.where({:projects => {:project_member_id => user.id}}).all.find {|p| p.id == params[:id]}
相关问题