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

时间:2012-11-30 16:53:00

标签: ruby-on-rails ruby activerecord

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

如果我设置

,是否有所作为
my_article.author_id = author_one.id

或者如果我

author_one << my_article

使用的关联是

  • 作者has_many文章
  • 文章所属_to作者

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

4 个答案:

答案 0 :(得分:14)

以下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.author = author
post.save

更短的版本

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

答案 1 :(得分:3)

我假设你的意思是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

之前,

不会被保留

答案 2 :(得分:0)

最好的事情是使用:

has_and_belongs_to_many

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

答案 3 :(得分:0)

恕我直言,正确的方法是在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社区都忽略了良好的面向对象原则,而更喜欢最简单但不正确的做事方式!