我有一个包含两个记录list_id
和car_id
的联接表。我想删除list_id = 5
和car_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 :(得分:0)
试试这个,
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中的所有记录。
答案 1 :(得分:0)
首先,您当前的代码显示两种不同的方法('deletejoin'和'destroyjoin')。你只需要一种方法就可以做到这一点。
其次,您没有指定用户应该如何销毁数据。由于您在代码中使用'params [:id]'和'params [list_id]',我假设您将通过表单或http url获取car_id和list_id。
话虽如此,在你的'destroyjoin'功能中,你的代码的某些部分还可以,但另一部分是错误的。我会告诉你详情:
car = Car.find(params[:id])
上面代码的部分是可以的。你确实会得到id = params [:id]的汽车。
@list = car.lists.find(params[:list_id])
这部分代码错了。实际上,当你使用'car.lists'时,你会得到一个与给定汽车相关的所有列表的集合(或者如果你愿意的话,也可以是'阵列')。在此集合中,您不能使用ActiveRecord方法'find'。 ActiveRecord'find'只能在类上调用,例如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
答案 2 :(得分:0)
非常感谢你的帮助 以下代码解决了它,现在只从连接表中删除
cars = Car.find(params[:id])
list = cars.lists.find(params[:list_id])
cars.lists.delete(params[:list_id])