Yo Ludke
Yo Ludke

Reputation: 2259

How to assign a has_many/belongs_to relation properly in Rails ActiveRecord?

I have a rails app with articles and author model. If I have an author and a post and want to indicate that the author should be the owner of the article, or that the article belongs to the author, what ist the best practice to do so? In particular:

Does it make a difference if I set

my_article.author_id = author_one.id

or If I do

author_one << my_article

The associations that are used are

And, by the way, what would be the best way to look it up if similar questions appear?

Upvotes: 9

Views: 12153

Answers (4)

Rudy Seidinger
Rudy Seidinger

Reputation: 1058

IMHO, the correct way of doing that is creating a instance method on your Article class, like the following:

class Author < ActiveRecord::Base
  ...
  def add_an_article(article)
    unless self.articles.include?(article)
      self.articles << article
    end
  end

end

This will provide a better semantic to your model and encapsulate the logic of the association manipulation...

That way, your class also will be compliant to Tell-don't-ask principle: http://pragprog.com/articles/tell-dont-ask.

Unfortunately, most of the Rails community ignores good OO principles and prefer the easiest but not right way of doing something!

Upvotes: 0

MrYoshiji
MrYoshiji

Reputation: 54902

There is not difference between the 3 following:

my_article.author_id = author_one.id
my_article.save
# same as
my_article.author = author_one
my_article.save
# same as
author_one.articles << my_article

To set the owner of a particular post, the most common and readable way would be:

post.author = author
post.save

OR shorter version:

post.update_attributes(author_id: author.id) # call an implicit save

Upvotes: 14

mikej
mikej

Reputation: 66343

I'm assuming you mean author_one.articles << my_article rather than just author_one << my_article

One difference between the two is that

author_one.articles << my_article

will save the change to the database immediately. i.e. it will either create the record for my_article if it has not been saved before or it will update the existing record to have author_id = author_one.id

whereas

my_article.author = author_one

or

my_article.author_id = author_one.id

will not be persisted until you do a my_article.save

Upvotes: 3

dealer
dealer

Reputation: 474

Best thing is to use:

has_and_belongs_to_many

Because, author may have written many article and article can have many authors.

Upvotes: -1

Related Questions