【问题标题】:ruby on rails can i use something like Model.find(params[:id]).where()ruby on rails 我可以使用 Model.find(params[:id]).where() 之类的东西吗
【发布时间】:2013-04-06 22:05:32
【问题描述】:

嗨,我还是一名学生,我正在学习软件工程课程,我们有一个大项目(网页设计),我们正在使用 rails,所以我的问题是我有一张桌子 Users 和一张桌子 @ 987654322@ 和另一个关联表 GroupUsers 有两个外键 user_idgroup_id。每当用户创建或加入已创建的组时,他的 id 和 group_id 都会添加到 GroupUsers 表中

module GroupUsersHelper
   def join
      @group_id = params[:id]
      @user_id = params[:user_id]
      @newuser= GroupUser.new(:group_id => @group_id, :user_id => @user_id)
      @newuser.save
      redirect_to(:controller => 'groups', :action => 'show', :id => @group_id)
   end
end

现在我必须创建方法离开组,我必须销毁来自GroupUsers 的记录,所以我也在GroupUsersHelper 中编写了这段代码

  def leave
      @group_id = params[:group_id]
      @user_id = params[:user_id]
      @group_user_id = params[:group_user_id]
      @newuser= GroupUser.find(@group_user_id).where(:group_id => @group_id, :user_id =>
      @user_id)
      @newuser.destroy
      redirect_to(:controller => 'groups', :action => 'show', :id => params[:id])
   end

但我收到此错误

ActiveRecord::RecordNotFound in GroupsController#leave

在没有 ID 的情况下找不到 GroupUser

如果您需要有关代码的更多信息,请告诉我。

【问题讨论】:

  • 添加视图以查看您的调用方式

标签: ruby-on-rails find where rails-activerecord


【解决方案1】:

其他答案解决了您的代码示例,但没有解决标题中的问题。您不能在 ActiveRecord(Rails 的默认 ORM)中使用 Model.find(params[:id]).where()。 Model.find 返回单个记录(您的 Model 类的一个实例),但 Model.where 返回一个 Model::ActiveRecord_Relation 对象(一个类似数组的对象)。 .where 方法仅在您的模型类上直接可用(即Model.where)或在 ActiveRecord_Relation 上可用。如果要链接方法,则需要确保每个方法都返回一个 ActiveRecord_Relation。例如:

Model.where("name = ?", "max")
     .order(created_at: :desc)
     .reorder(created_at: :asc)
     .includes(:sent_comments)

【讨论】:

    【解决方案2】:
    Model.find(params[:id]) will generate such kind of query
    
     *Lets take an example : GroupUser.find(params[:id]) will generate sql equivalent*
     select * from group_users where id = params[:id]
    
    If you want to add where condition do something like this
    GroupUser.where("# id ={params[:id]} and someColumn = #{somevariable}")
    

    【讨论】:

    • 我担心的是,如果 find 方法自动将条件放在 id 上,为什么要这样做。默认情况下,id 是 rails 应用程序中的主键。
    【解决方案3】:

    您没有在 params 哈希中传递 groupuser_id。与其将其存储在@group_id@user_id 中,不如试试这个:

    @newuser= GroupUser.find_by_group_id_and_user_id(params[:group_id],params[:user_id])
    

    您能否另外发布您的参数转储,以便我们弄清楚如何进行良好的重定向,因为我因此这也是一个问题。

    【讨论】:

      【解决方案4】:

      只要做:

      group = Group.find(params[:group_id])
      user = User.find(params[:user_id])
      group.users.delete(user)
      group.save
      

      这会将用户从用户关联中删除,并在保存组时自动销毁 GroupUser 记录。请参阅collection.delete 方法。

      【讨论】:

        【解决方案5】:

        @maxplener 是对的,你不应该使用 Model.find().where()。

        这是不正确的,如果你仔细想想,你会发现它是多余的。要找到你想销毁的关联,你要么需要 params[:group_id] 和 params[:user_id],要么只需要 params[:group_user_id]。

        如果您已将 params[:group_user_id] 传递给 leave 方法,则您已经拥有查找关联所需的所有信息:

        def leave
          @newuser= GroupUser.find(params[:group_user_id])
          @newuser.destroy
          redirect_to(:controller => 'groups', :action => 'show', :id => params[:group_id])
        end
        

        或者,如果您已将 params[:group_id] 和 params[:user_id] 传递给 leave 方法:

        def leave
          @newuser= GroupUser.find_by_group_id_and_user_id(params[:group_id], params[:user_id])
          @newuser.destroy
          redirect_to(:controller => 'groups', :action => 'show', :id => params[:group_id])
        end
        

        此外,您的代码中还有一些其他冗余,您会注意到我在上面省略了。在将参数传递给 find() 方法之前,无需将每个参数分配给实例变量:

        @model_id = params[:model_id]
        @model= Model.find(@model_id)
        
        #can be simplified to:
        
        @model = Model.find(params[:model_id])
        

        通常,您只想为需要在视图中访问的记录或记录集合创建实例变量(例如应用程序上下文中的组)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多