如何从rails中的连接表中删除记录

时间:2016-07-04 13:55:36

标签: mysql ruby-on-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

3 个答案:

答案 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。

  • 如果是这样的话,提到'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方法'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])