在rails中删除多个到多个集合条目中的第一个匹配项?

时间:2015-07-19 23:34:27

标签: ruby-on-rails ruby

在许多字段中delete方法正在删除所有出现的集合。说我有:

class user < ActiveRecord::Base
  has_and_belongs_to_many :cars
end

class car < ActiveRecord::Base
  has_and_belongs_to_many :users
end

用户和汽车是多对多的关系,我已经定义了我的users_cars表。现在用户可以将重复的汽车进入作为关系。例如:

汽车:A,B,C 用户:U1,U2,U3

U1 = [A,B,C,A,A,A,B]

可以使用多对多关系来实现,这是我实施的方式。但是,当我想删除用户的一个汽车条目时,问题就出现了。

User.cars.delete(car) #deletes all occurrence of car
User.cars.delete_at(User.cars.find_index(video_card)) #delete_at does not exist

现在该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

首先,除非您在User.cars模型中定义了类级方法cars,否则无法调用User,但这样,您将返回所有车辆,而且 - 绝不是 - 会有意义的。

其次,delete_at是一个适用于Array个对象的方法,并且希望传入一个整数。所以,作为一个小的黑客,你可以将你的ActiveRecord::Associations对象变成一个数组,然后调用delete_at方法。

user = User.first
user.cars.to_a.delete_at(Car.last.id) # assuming that the last car belongs
# to the first user, something you would never do in actual
# production code.

修改

您还可以尝试以下操作来实现相同的功能:

user = User.first
user.cars.where("cars.id = ?", Car.first.id).first.delete

编辑2:

对于您在评论中提出的问题,您可以拥有表cars_users的模型。

rails g model CarUser

class Car < ActiveRecord::Base
  has_many :cars_users
  has_many :users, through: car_users
end 

class User < ActiveRecord::Base
  has_many :cars_users
  has_many :cars, through: car_users
end

class CarUser < ActiveRecord::Base
  belongs_to :car
  belongs_to :user
end

现在,你可以这样做:

CarUser.where("car_id = ? AND user_id = ?", Car.first.id, User.first.id).first.delete