ruby on rails我可以使用类似Model.find(params [:id])的东西。哪里()

时间:2013-04-06 22:05:32

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

嗨,我还是一名学生,我正在参加软件工程课程,我们有这个大项目(网页设计),我们正在使用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

找不到没有ID的GroupUser

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

5 个答案:

答案 0 :(得分: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}")

答案 1 :(得分:0)

您没有在params散列中传递groupuser_id。不要将其存储在@group_id@user_id中,只需尝试以下操作:

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

你可以另外发布你的params转储,这样我们就可以弄清楚如何做一个好的重定向因为我因此也会成为一个问题。

答案 2 :(得分:0)

只是做:

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

@max pleaner是对的,你不应该使用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])

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