8

我有一个带有文章和作者模型的 Rails 应用程序。如果我有作者和帖子,并且想表明作者应该是文章的所有者,或者文章属于作者,那么这样做的最佳做法是什么?尤其是:

如果我设置它会有所不同吗

my_article.author_id = author_one.id

或者如果我这样做

author_one << my_article

使用的关联是

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

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

4

4 回答 4

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
于 2012-11-30T16:56:04.650 回答
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

于 2012-11-30T17:03:04.943 回答
0

最好的方法是使用:

has_and_belongs_to_many

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

于 2012-11-30T16:57:11.607 回答
0

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

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

end

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

这样,您的班级也将符合告诉-不问原则: http: //pragprog.com/articles/tell-dont-ask

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

于 2012-11-30T17:13:53.300 回答