English 中文(简体)
Rails ActiveRecord relationships - has many and belongs to associations
原标题:

I ve created 3 models:

  • Article: contains an article
  • Tag: contains tags
  • ArticleTag: meant for associating a many-to-one tags to article relationship. It contains a tag_id and an article_id.

The problem I m having is I m fairly new to the active record technology and I don t understand the proper way to define everything. Currently, which I think is wrong, is I have a

ArticleTag
 belongs_to :article
 belongs_to :tag

Now, from here my thought was to then add

  Article
   :has_many :tag

I m not sure if im approaching this correctly at all. Thanks for the help!

最佳回答

It depends whether you want a join model or not. A join model lets you hold extra information against the association between two other models. For example, perhaps you want to record a timestamp of when the article was tagged. That information would be recorded against the join model.

If you don t want a join model, then you could use a simple has_and_belongs_to_many association:

class Article < ActiveRecord::Base
  has_and_belongs_to_many :tags
end

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :articles  
end

With a Tagging join model (which is a better name than ArticleTag), it would look like this:

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

class Tag < ActiveRecord::Base
  has_many :taggings
  has_many :articles, :through => :taggings  
end

class Tagging < ActiveRecord::Base
  belongs_to :article
  belongs_to :tag
end
问题回答

You should use has_many when the relationship is one-way. An article has many tags, but tags also have many articles, so that s not quite right. A better choice might be has_and_belongs_to_many: an Article has many Tags, and those Tags also reference articles. A belongs_to B means that A references B; A has_one B means that B references A.

Here s a summary of the relationships you might see:

Article
  has_and_belongs_to_many :tags   # An article has many tags, and those tags are on
                                  #  many articles.

  has_one                 :author # An article has one author.

  has_many                :images # Images only belong to one article.

  belongs_to              :blog   # This article belongs to one blog. (We don t know
                                  #  just from looking at this if a blog also has
                                  #  one article or many.)

Off the top of my head, Article should be:

has_many :article_tags
has_many :tags, :through => :article_tags




相关问题
rails collection_select vs. select

collection_select and select Rails helpers: Which one should I use? I can t see a difference in both ways. Both helpers take a collection and generates options tags inside a select tag. Is there a ...

SSL slowness in EC2

We ve deployed our rails app to EC2. In our setup, we have two proxies on small instances behind round-robin DNS. These run nginx load balancers for a dynamically growing and shrinking farm of web ...

Auth-code with A-Za-z0-9 to use in an URL parameter

As part of a web application I need an auth-code to pass as a URL parameter. I am currently using (in Rails) : Digest::SHA1.hexdigest((object_id + rand(255)).to_s) Which provides long strings like : ...

RubyCAS-Client question: Rails

I ve installed RubyCAS-Client version 2.1.0 as a plugin within a rails app. It s working, but I d like to remove the ?ticket= in the url. Is this possible?

activerecord has_many :through find with one sql call

I have a these 3 models: class User < ActiveRecord::Base has_many :permissions, :dependent => :destroy has_many :roles, :through => :permissions end class Permission < ActiveRecord::...

Ordering a hash to xml: Rails

I m building an xml document from a hash. The xml attributes need to be in order. How can this be accomplished? hash.to_xml

Text Editor for Ruby-on-Rails

guys which text editor is good for Rubyonrails? i m using Windows and i was using E-Texteditor but its not free n its expired now can anyone plese tell me any free texteditor? n which one is best an ...

How to get SQL queries for each user where env is production

I’m developing an application dedicated to generate statistical reports, I would like that user after saving their stat report they save sql queries too. To do that I wrote the following module: ...

热门标签