我正在掌握Rails3,但我似乎无法从结果集中进行基本的查找。我的代码如下所示:
@project =
@user.where({:projects => {:project_member_id => user.id}}).find_by_id(params[:id])
我知道"where"部分不会返回集合,而只是创建一个等待对数据库运行的查询。然而,我不明白为什么我在尝试运行find_by_id:时会出现以下错误
undefined method `to_sql' for #<Arel::Attributes::String:0x106d9ecf0>
有人能指出我哪里错了吗?
也许你可以写这样的东西:
@project =
@user.where({:projects => {:project_member_id => user.id}}).where(:id => params[:id])
我认为它会起作用。
亚历克斯。
我可能误解了您在这里试图做的事情,但在用户模型中似乎有一个名为projects
的关联,对吧?如果是这样的话,这就简单多了(而且有效):
@project = @user.projects.find params[:id]
如果您没有关联设置,您应该查看它们。关于这个问题,这里有一本很棒的铁路指南。
我希望这能有所帮助。
如上所述,"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的项目(这可能很昂贵,而且可能不是你想要的)。。。
祝你好运!
尝试
@project =
@user.where({:projects => {:project_member_id => user.id}}).where(:id => params[:id]).first
但是我不明白你为什么带着钥匙就这么干。。我认为仅仅Model.find params[:id]
就足够了(我认为还有更多的东西)。
试试这个:
@project = @user.where({:projects => {:project_member_id => user.id}}).all.find {|p| p.id == params[:id]}