如何在Rails ActiveRecord中正确分配has_many / belongs_to关系?

我有一个带有文章和作者模型的rails应用程序。 如果我有作者和post并希望表明作者应该是文章的所有者,或者文章属于作者,那么最佳做法是什么? 特别是:

如果我设置它会有所作为吗?

my_article.author_id = author_one.id 

或者如果我这样做

 author_one << my_article 

使用的关联是

  • 作者has_many文章
  • 文章belongs_to作者

顺便说一句,如果出现类似的问题,最好的方法是什么呢?

以下3个没有区别:

 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 

要设置特定post的所有者,最常见和可读的方式是:

 post.author = author post.save 

或更短的版本

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

我假设你的意思是author_one.articles << my_article而不仅仅是author_one << my_article

两者之间的一个区别是

 author_one.articles << my_article 

将立即将更改保存到数据库。 即如果之前没有保存,它将为my_article创建记录,或者它将更新现有记录以具有author_id = author_one.id

 my_article.author = author_one 

要么

 my_article.author_id = author_one.id 

在执行my_article.save之前不会my_article.save

最好的事情是使用:

 has_and_belongs_to_many 

因为,作者可能写过很多文章和文章可以有很多作者。

恕我直言,正确的方法是在Article类上创建一个实例方法,如下所示:

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

这将为您的模型提供更好的语义,并封装关联操作的逻辑......

这样,您的课程也将符合Tell-not-ask原则: http : //pragprog.com/articles/tell-dont-ask 。

不幸的是,大多数Rails社区忽略了良好的OO原则,并且更喜欢最简单但不正确的做事方式!