1

嗨,我仍然是一名学生,我正在学习软件工程课程,我们有这个大项目(网页设计),我们正在使用 rails,所以我的问题是我有一个表和Users一个表Groups以及另一个关联表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

GroupUser没有身份证找不到

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

4

5 回答 5

1

其他答案解决了您的代码示例,但没有解决标题中的问题。您不能Model.find(params[:id]).where()在 ActiveRecord(Rails 的默认 ORM)中使用。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)
于 2015-12-30T18:08:22.890 回答
1
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}")
于 2015-12-31T05:35:54.067 回答
0

做就是了:

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

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

于 2013-04-06T23:34:29.593 回答
0

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

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

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

于 2013-04-06T22:11:16.027 回答
0

@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])

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

于 2015-12-31T18:16:16.573 回答