HABTM 3 table relation


#1

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


#2

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


#3

that worked thank you very much!

On Sat, Dec 20, 2008 at 2:51 AM, Marnen Laibow-Koser
removed_email_address@domain.invalidwrote:

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