2015-07-19 80 views
0

在多到多的字段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 

現在該如何解決?

+0

你就不能使用'User.cars.delete_at(User.cars.find_index(車))''沒有User.cars.delete (車)'? – AbM

+0

你提到'User.cars.delete(car)'刪除了所有的事件。 User.cars.delete_at(User.cars.find_index(card))'也會刪除所有的事件嗎? – AbM

+0

你好嗎'User.cars'?課堂上的'汽車'方法? –

回答

1

首先,除非您已在User模型中定義類級別方法cars,否則不能撥打User.cars,但這樣,您將返回所有車輛,而且 - 絕不會 - 有意義。

其次,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 
+0

'to_a'返回新的數組,所以當我嘗試保存它時會是一樣的,我該怎麼做?在這種情況下,我需要清空陣列並重新填充它,是這樣嗎? – sadaf2605

+0

聽起來不錯,但我驚訝地發現它不起作用!它也刪除了兩個條目。 – sadaf2605

+0

它總是會刪除一輛車。我保證。再試一次。 –

相關問題