簡體   English   中英

如何從Rails的聯接表中刪除記錄

[英]how to delete record from a join table in rails

我有一個具有兩個記錄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

嘗試這個,

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

此代碼通過匹配car_id和list_id從聯接表car_lists中刪除所有記錄。

首先,您當前的代碼顯示了兩種不同的方法(“ deletejoin”和“ destroyjoin”)。 您只需要一種方法即可執行此操作。

其次,您未指定用戶應如何銷毀數據。 由於您在代碼中使用了'params [:id]'和'params [list_id]',因此我假設您將通過表單或http url獲得car_id和list_id。

  • 如果是這樣,則可以引用'params [..]'。
  • 如果不是這種情況,則可以為“ destroyjoin”方法設置兩個參數,並使用要刪除的car_id和list_id調用該方法。

就是說,有了“ destroyjoin”功能,代碼的某些部分就可以了,但是另一部分是錯誤的。 我將為您提供詳細信息:

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

上面的代碼部分沒問題。 您的確會獲得帶有id = params [:id]的汽車。

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

代碼的第二部分是錯誤的。 確實,當您使用“ car.lists”時,您將獲得與給定汽車相關的所有列表的集合(如果願意,可以使用“數組”)。 在此集合上,您不能使用ActiveRecord方法“查找”。 ActiveRecord的“查找”只能在諸如Car(請注意用大寫字母“ C”)或“ List”(請注意用大寫字母“ 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 

非常感謝您的幫助,以下代碼解決了該問題,現在僅從連接表中將其刪除

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM