2011-10-06 40 views
1

我想讓人們直接更新記錄,如果他們知道ID或放在名稱/地址類型的信息,它會找到正確的記錄或創建一個新的記錄,如果它不存在。我該如何做一個由ID查找,如果它存在,否則做一個find_or_initialize_by_columname(PARAMS [:somevalue])

@donor = Donor.find_or_initialize_by_company_and_prefix1_and_first_name1_and_last_name1_and_address1(params[:donor])

就好了,只要輸入的記錄包含了所有必要的列(它將如果我在通過CSV文件讀取這些信息。)

上述作品,但現在我會喜歡提供僅包含一個ID的選項,如果它存在於數據庫中,則使用該選項。如果沒有,我會運行上述語句來查找這些列或創建一條新記錄。

我的控制器如下:

 def create 
     # need to find donor by id if given, else use find_or_create_by_blahblahblah 

     @donor = Donor.find_or_initialize_by_company_and_prefix1_and_first_name1_and_last_name1_and_address1(params[:donor]) 


     if @donor.new_record? 
      @donor.save 
      respond_to do |format| 
      if @donor.save 
       format.html { redirect_to @donor, notice: 'Donor was successfully created.' } 
       format.json { render json: @donor, status: :created, location: @donor } 
      else 
       format.html { render action: "new" } 
       format.json { render json: @donor.errors, status: :unprocessable_entity } 
      end 
      end  
     else 
      respond_to do |format| 
      if @donor.save 
       format.html { redirect_to @donor, notice: 'Donor already exists. Please edit donor if needed.'} 
       format.json { render json: @donor, status: :created, location: @donor } 
      else 
       format.html { render action: "new" } 
       format.json { render json: @donor.errors, status: :unprocessable_entity } 
      end 
      end 
     end 

     end 

我無法找到如果一個ID提供給檢查它做什麼。

我想是這樣的:

@donor = Donor.find_by_id(params[:donor]) 
if [email protected] 
    @donor = Donor.find_or_initialize_by_all_those_columns(params[:donor]) 
end 

,但是這給了我,如果我把數據,比方說一個錯誤,該公司現場,而不是隻ID字段。

我確信有一個很好的方法可以做到這一點,我只是還沒有看到。任何幫助,將不勝感激。

回答

3

試試這個:

unless @donor = Donor.find_by_id(params[:donor][:id]) // returns `nil` if record not found 
    @donor = Donor.find_or_initialize_by_all_those_columns(params[:donor]) 
end 

@donor.new_record? ... 

第一行查找與傳遞的ID的記錄。如果它返回一個記錄,然後@donor被設置爲記錄和塊不運行。如果沒有,那麼它將返回nil(使用find_by_id()而不是find()對此很重要,因爲find()如果找不到記錄就會產生錯誤),並且該塊將運行,將@donor設置爲一個記錄(新的或不是)這些參數。

希望這會回答你的問題。

+0

我創建了一個gem,它有助於這個名爲'find_by_hash':http://github.com/radar/find_by_hash。 –

3

如果記錄已存在,您通常會將表單提交路由到您的控制器的update操作。

儘管如此,如果您想要處理create操作中的情況,您只需要知道哪個參數具有捐助者ID。我會猜測並說它可能params[:donor][:id]。如果是這種情況,那麼這將工作:

@donor = Donor.find_by_id(params[:donor][:id]) 

看看你的表單參數找出正確的名稱。

相關問題