2013-04-06 43 views
1

嗨,我還是一名學生,我參加了一個軟件工程課程,我們有這個大型項目(網頁設計),我們正在使用rails,所以我的問題是我有一個表Users和一個表Groups和另一個關聯表GroupUsers它有兩個外鍵user_idgroup_id。每當用戶創建或加入一個已經創建的組他的ID和GROUP_ID添加到GroupUsersruby​​ on rails我可以使用類似Model.find(params [:id])的東西。其中()

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沒有ID

如果您需要更多關於代碼的信息,請讓我知道。

+0

添加視圖來看看你的調用方式 – Zippie 2013-04-06 22:09:04

回答

0

您未通過參數散列中的groupuser_id。相反,將其存儲在@group_id@user_id的,只是試試這個:

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

你能還發表您的PARAMS傾倒,所以我們可以計算出如何使一個很好的重定向,因爲我因此這將是一個問題也。

0

只要做到:

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

這將從用戶協會刪除用戶,並在保存該組將自動銷燬的GroupUser記錄。請參閱collection.delete方法。

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) 
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}") 
+0

我擔心的是,爲什麼你要這樣做,如果find方法自動將條件放在id的地方。並且id是Rails應用程序中默認的主鍵。 – ashwintastic 2015-12-31 05:44:04

0

@Max pleaner是正確的,你不應該使用Model.find(),其中()。

這是不正確的,如果你仔細想想,你會發現它是多餘的。要找到想要銷燬的關聯,您需要params [:group_id]和params [:user_id],或者僅需params [:group_user_id]。

如果你已經通過了PARAMS [:group_user_id]的離開方式,你已經找到關聯所需的所有信息:

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]的離開方法:

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

一般情況下,你只需要創建的,你需要記錄的記錄或集合實例變量在視圖中訪問(例如應用程序上下文中的組)。