Ruby on rails RubyonRails可以使用Model.find(params[:id]).where()之类的东西吗
嗨,我还是一名学生,我正在学习软件工程课程,我们有一个大项目(网页设计)我们使用的是rails,所以我的问题是我有一个表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
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])