Reputation: 2259
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
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
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
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
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