3

次の不自然な例を考えてみましょう:

class Company < ActiveRecord::Base
  has_many :projects
end

class Project < ActiveRecord::Base
  belongs_to :company
end

c, p = Company.new, Project.new

c.projects << p
p.company  => c

プロジェクトがコレクションに追加されると、会社への逆関連付けが Rails によって自動的に設定されます。残念ながら、これは Rails がこれを行うのに十分賢い唯一の機会です。反対側からの代入は、オブジェクトを逆コレクションに追加しません。

c, p = Company.new, Project.new

p.company = c
c.projects => []

多対多の関係は、自動逆参照割り当ても行いません。ActiveRecord と DataMapper の両方がこの動作を示します。これには技術的な理由がありますか?保存と再読み込みが発生する前に一貫した関連付けを行うと、特定のテスト ケースが大幅に高速化され、一般的に物事がよりクリーンになります。

4

2 に答える 2

0

ドキュメントでは明確に伝えられていない可能性のある微妙な効果ですが、これら2つの操作が何をするかを誤解しています。

<<オペレーターはプロジェクトに割り当てるだけでcompany_idなく、レコードが存在する場合は保存します。これはprojects、会社モデルのキャッシュにも追加されます。

このcompany=メソッドは割り当てのみを行い、オブジェクト間の通信は行いません。保存されていないレコードは、意図したとおりにロードできません。これらのレコードはどちらも実際にはデータベースにないためc.projects、最初のケースのように明示的に何かを追加しない限り、空の配列になります。

一般に、保存されていないオブジェクトは、データベースに永続化された対応物と同様に動作しません。

于 2012-10-04T17:30:06.643 に答える
0

https://github.com/rails/rails/pull/9522を参照してください。自動逆関連付けは、Rails の将来のバージョンで機能になる可能性があります。

于 2013-03-28T23:24:29.607 に答える