Forum: Ruby on Rails HABTM 3 table relation

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Felipe V. (Guest)
on 2008-12-19 15:27
(Received via mailing list)
Some help please!!
class Article < ActiveRecord::Base
 has_and_belongs_to_many :tags, :join_table => :articles_tags_users
 has_and_belongs_to_many :users, :join_table => :articles_tags_users
end

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :articles, :join_table => :articles_tags_users
 has_and_belongs_to_many :users, :join_table => :articles_tags_users
end

class User < ActiveRecord::Base
 has_and_belongs_to_many :articles, :join_table => :articles_tags_users
 has_and_belongs_to_many :tags, :join_table => :articles_tags_users
end

then in the controller

user = User.new
tag = Tag.find(id)
article = Article.find(id)
user.tag << tag
user.article << article

all this creates 2 tuples on the database articles_tags_users instead of
one
with all the values

Do somebody knows how to do this?

Thanks !
--
Felipe V. Contesse
Ingeniería Civil Industrial UC
Marnen L. (Guest)
on 2008-12-20 07:52
(Received via mailing list)
On Dec 19, 8:26 am, "Felipe V." <removed_email_address@domain.invalid> wrote:
> Some help please!!
> class Article < ActiveRecord::Base
>  has_and_belongs_to_many :tags, :join_table => :articles_tags_users
[...]
> user = User.new
> tag = Tag.find(id)
> article = Article.find(id)
> user.tag << tag
> user.article << article
>
> all this creates 2 tuples on the database articles_tags_users instead of one
> with all the values
>
> Do somebody knows how to do this?

I hope someone will correct me if I'm wrong, but I believe you will
need to use has_many :through for this case -- HABTM isn't meant for 3-
way joins as far as I know.  You'll need something like this:

class Article < ActiveRecord::Base
  has_many :correlations
  has_many :tags, :through => :correlations
  has_many :users, :through => :correlations
end

(similarly for User and Tag)

class Correlation < ActiveRecord::Base
  belongs_to :article
  belongs_to :tag
  belongs_to :user
end

Then your sample controller code would become something like

user = User.new
tag = Tag.find(id)
article = Article.find(id)
user.correlations << Correlation.new(:tag => tag, :article => article)

Does that help?

Best,
--
Marnen Laibow-Koser
removed_email_address@domain.invalid
http://www.marnen.org
Felipe V. (Guest)
on 2009-01-02 01:28
(Received via mailing list)
that worked thank you very much!

On Sat, Dec 20, 2008 at 2:51 AM, Marnen Laibow-Koser
<removed_email_address@domain.invalid>wrote:

> > user.article << article
>
>  belongs_to :tag
> Does that help?
>
> Best,
> --
> Marnen Laibow-Koser
> removed_email_address@domain.invalid
> http://www.marnen.org
> >
>


--
Felipe V. Contesse
Ingeniería Civil Industrial UC
This topic is locked and can not be replied to.