Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.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 RubyonRails可以使用Model.find(params[:id]).where()之类的东西吗_Ruby On Rails_Find_Where_Rails Activerecord - Fatal编程技术网

Ruby on rails RubyonRails可以使用Model.find(params[:id]).where()之类的东西吗

Ruby on rails RubyonRails可以使用Model.find(params[:id]).where()之类的东西吗,ruby-on-rails,find,where,rails-activerecord,Ruby On Rails,Find,Where,Rails Activerecord,嗨,我还是一名学生,我正在学习软件工程课程,我们有一个大项目(网页设计)我们使用的是rails,所以我的问题是我有一个表Users和一个表Groups和另一个关联表GroupUsers,其中有两个外键user\u id和group\u id。每当用户创建或加入已创建的组时,其id和组id将添加到GroupUsers表中 module GroupUsersHelper def join @group_id = params[:id] @user_id = params

嗨,我还是一名学生,我正在学习软件工程课程,我们有一个大项目(网页设计)我们使用的是rails,所以我的问题是我有一个表
Users
和一个表
Groups
和另一个关联表
GroupUsers
,其中有两个外键
user\u id
group\u id
。每当用户创建或加入已创建的组时,其id和组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
现在我必须创建方法leave group,在这里我必须销毁来自
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


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

您没有在参数散列中传递
groupuser\u id
。不要将其存储在
@group\u id
@user\u id
中,只需尝试以下操作:

@newuser= GroupUser.find_by_group_id_and_user_id(params[:group_id],params[:user_id])
你能不能另外发布你的参数转储文件,这样我们就可以知道如何进行良好的重定向,因为我认为这也是一个问题

只要做:

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

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

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

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

@max pleaner是对的,您不应该使用Model.find().where()

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

如果已将参数[:group\u user\u 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()方法之前,无需将每个参数分配给实例变量:


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

添加视图以查看您如何调用它。我关心的是,如果find方法自动将id上的条件放置在rails应用程序中,并且默认情况下id是主键,那么为什么要这样做。
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
@model_id = params[:model_id]
@model= Model.find(@model_id)

#can be simplified to:

@model = Model.find(params[:model_id])