8

記事と著者モデルを備えたRailsアプリがあります。著者と投稿があり、著者が記事の所有者であること、または記事が著者に属していることを示したい場合、そのためのベストプラクティスは何ですか?特に:

私が設定した場合、それは違いを生むでしょうか

my_article.author_id = author_one.id

または私がする場合

author_one << my_article

使用される関連付けは

  • 著者has_many記事
  • 記事belongs_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

2つの違いの1つは、

author_one.articles << my_article

変更をすぐにデータベースに保存します。つまり、my_article以前に保存されていない場合のレコードを作成するか、既存のレコードを次のように更新しますauthor_idauthor_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

IMHO、それを行う正しい方法は、次のように、Articleクラスにインスタンスメソッドを作成することです。

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

end

これにより、モデルのセマンティクスが向上し、関連付け操作のロジックがカプセル化されます...

そうすれば、クラスは「Tell-don't-ask」の原則にも準拠します:http: //pragprog.com/articles/tell-dont-ask

残念ながら、Railsコミュニティのほとんどは、優れたOOの原則を無視しており、最も簡単ではあるが正しい方法ではないことを好みます。

于 2012-11-30T17:13:53.300 に答える