2016-07-04 15 views
0

私は2つのレコードlist_idcar_idを持つ結合テーブルを持っています。たとえば、list_id = 5car_id = 7というレコードを削除したいとします。ここに私のコードは、コントローラ部である:レール内の結合テーブルからレコードを削除する方法

def deletejoin 
    @car = Car.find(params[:id]) 
    end 
    def destroyjoin 
    # car = Car.find(params[:id]) 
    # list = List.find(params[:list_id]) 
    # car = Car.find(21.to_i) 
    # list = List.find(8) 
    # puts car 
    # puts list 
    car = Car.find(params[:id]) 
    @list = car.lists.find(params[:list_id]) 
    cars_lists.where(car_id: 25).destroy_all 
    # @list.cars.where(:id => params[:id]).destroy_all 
    # @list = @car.cars_lists.find(params[:list_id]) 
    # @list.destroy 
    # car = Car.find(params[:id]).destroy 
    flash[:notice] = "Car #{car.name} destoryed successfully" 
    redirect_to(:action => 'index', :list_id => @list.id) 
    end 
+0

車= Car.find(paramsは[:ID])から削除 @list = car.lists.find(paramsは[:LIST_ID]) cars_lists.where (car_id:25).destroy_all idsは正しく来ますが、この特定のレコードを削除できません。 – peterateftawfik

+1

お願いします。より良い回答を得るためにコードセクションを改善してください。 –

答えて

0

は、このコードはcar_idとLIST_IDを照合することによって結合テーブルのcar_listsからすべてのレコードを削除

def delete_join 
    car = Car.find(params[:id]) 
    list = List.find(params[:list_id]) 
    CarsLists.where(car_id: car.id, list_id: list.id).destroy_all 
end 

、これを試してみてください。

0

まず、現在のコードでは2つの異なるメソッド( 'deletejoin'と 'destroyjoin')が表示されています。これを行うには1つの方法しか必要ありません。

第2に、ユーザーがデータをどのように破棄できるかを指定しません。あなたのコードでは 'params [:id]'と 'params [list_id]'を使用するので、formまたはhttp urlを通してcar_idとlist_idを取得すると仮定します。

  • この場合、「params [..]」を参照すると問題ありません。
  • そうでない場合は、destroyjoinメソッドに2つのパラメータを設定し、削除したいcar_idとlist_idを使ってメソッドを呼び出すことができます。

あなたは 'destroyjoin'関数を使用していると言われていますが、コードの一部は正常ですが、別の部分が間違っています。私はあなたの詳細をあげる:

car = Car.find(params[:id])

上記のコードの一部はokです。あなたは実際にid = params [:id]で車を取得します。

@list = car.lists.find(params[:list_id])

コードのこの第二の部分は間違っています。確かに、 'car.lists'を使用すると、特定の車に関連するすべてのリストのコレクション(または必要に応じて '配列')を取得します。このコレクションでは、ActiveRecordメソッド 'find'を使用することはできません。 ActiveRecord 'find'は、Car(Capital 'C'に注意してください)や 'List'(Capital 'L'に注意してください)などのクラスでのみ呼び出すことができます。あなたが破壊することを破壊する車やリストを得れば、あなたがそれらを直接識別することができ、その後

list = List.find(params[:list_id])

代わりに、リストを検索するには、次のコードを使用する必要がありますそのid( 'list.id'と 'car.id')を使ってまた、破棄するジョイン・テーブルのインスタンスを探すことができます。このために、私はあなたのクラスが大文字で書かれるべきであるあなたの「車リスト」結合テーブルに関連するモデルを持っていると仮定します:CarsLists。 したがって、コードは次のようになります。

CarsLists.where(car_id: car.id, list_id: list.id).destroy_all

最後に、私はあなたにも車やリストのどちらかが破壊されている場合CarsListsレコードを破壊したいと思うでしょうね。そうならば、あなただけの次のことを書くためにあなたのcar.rbモデルにして、list.rbモデルに行く必要があります:あなたの助けを

class Car < ActiveRecord::Base 
 
    has_many :carslists, dependent: :destroy 
 
end 
 
           
 
class List < ActiveRecord::Base 
 
    has_many :carslists, dependent: :destroy 
 
end

+0

こんにちは。答えの1つは最終的にあなたを助けましたか? "チェックマーク"にチェックを入れて、あなたの質問をアップホートしたり、閉じたりするのをためらってください。ありがとう。 – Quentin

0

おかげでたくさん 次のコードは、それを解決し、それは今結合テーブルのみ

cars = Car.find(params[:id]) 
list = cars.lists.find(params[:list_id]) 
cars.lists.delete(params[:list_id]) 
+0

リストに同じcar idを持つすべてのリストを見つける方法 – peterateftawfik

関連する問題