Deleting only first occurrence from many to many collection

17 views
Skip to first unread message

Sadaf Noor

unread,
Jul 19, 2015, 7:54:26 PM7/19/15
to rubyonra...@googlegroups.com

Hello, 
I am having a little bit problem in deleting duplicate entry of my many to many tables.

In many to many fields delete method is deleting all the occurrence of collection. Say I have (demo example):

class user < ActiveRecord::Base
  has_and_belongs_to_many :cars
end

class car < ActiveRecord::Base
  has_and_belongs_to_many :users
end

users and cars are many to many relationship, I have defined my users_cars table. Now user can have repetitive car entry as relation. For example:

Car: A,B,C User: U1,U2,U3

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

Which can be implemented using many to many relationship, the way I have implemented. BUT, at the time when I want to delete one of the car entries of user the problem occurs.

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

Now how to resolve this?

I have also posted at stackoverslow (http://stackoverflow.com/questions/31507056/deleting-first-occurrence-from-many-to-many-collection-entry-at-rails). Please feel free to answer, and/or upvote.


Thanks.

--
 Md. Sadaf Noor (@sadaf2605)
 www.sadafnoor.com

Colin Law

unread,
Jul 20, 2015, 4:29:59 PM7/20/15
to rubyonra...@googlegroups.com
On 20 July 2015 at 00:53, Sadaf Noor <em...@sadafnoor.com> wrote:
>
> Hello,
> I am having a little bit problem in deleting duplicate entry of my many to many tables.
>
> In many to many fields delete method is deleting all the occurrence of collection. Say I have (demo example):
>
> class user < ActiveRecord::Base
> has_and_belongs_to_many :cars
> end
>
> class car < ActiveRecord::Base
> has_and_belongs_to_many :users
> end
>
> users and cars are many to many relationship, I have defined my users_cars table. Now user can have repetitive car entry as relation. For example:
>
> Car: A,B,C User: U1,U2,U3
>
> U1=[A,B,C,A,A,A,B]

How can a user have the same car multiple times, it doesn't make sense.

Colin

Elizabeth McGurty

unread,
Jul 20, 2015, 5:02:31 PM7/20/15
to rubyonra...@googlegroups.com, em...@sadafnoor.com
Don't know what your skill level is, but I would suggest checking out RailsCasts, #47 Two Many-to-Many: http://railscasts.com/episodes/47-two-many-to-many
Your join table could be called CarOwners, as a point relevant to the RailsCast....  Check it out... The general idea is that it is maybe better if you use :has_many :through...

Hope this helps. 

Sadaf Noor

unread,
Jul 21, 2015, 5:28:39 AM7/21/15
to rubyonra...@googlegroups.com
@colin, certainly I can have a same model car twice :P whatever, it was just a made up scenario.
@Elizabeth, railscast helped. I did it with has_many :through. :)

Thank you everyone.

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-ta...@googlegroups.com.
To post to this group, send email to rubyonra...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/d33d14b9-c9b4-4bb5-9edf-4c9d79554824%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Colin Law

unread,
Jul 21, 2015, 5:34:19 AM7/21/15
to rubyonra...@googlegroups.com
On 21 July 2015 at 10:27, Sadaf Noor <em...@sadafnoor.com> wrote:
@colin, certainly I can have a same model car twice :P whatever, it was just a made up scenario.

If it is the model of car (not an actual car) then you should call the model CarModel or similar to avoid confusion.  In that case I agree with Elizabeth, use has_many through.  Also you might like to consider having a counter in the join table rather than multiple joins, or perhaps that is what you have done already.

Colin

Colin Law

unread,
Jul 21, 2015, 8:33:31 AM7/21/15
to rubyonra...@googlegroups.com
Or possibly even better
User has_many cars
CarModel has_many cars

So the join model means something in the real world.

Colin

>
> Colin
>
Reply all
Reply to author
Forward
0 new messages