29

この変更をデータベースにすぐにコミットせずに、Rails で既存のレコードに関連付けを追加することは可能ですか? たとえば、Post has_many :tags がある場合

post.tags << Tag.first

これにより、すぐにデータベースにコミットされます。<< の代わりに他の方法を試しましたが、成功しませんでした (私が望むのは、親オブジェクトを保存するときに関連付けを作成することです)。ビルドで新しいレコードに関連付けを追加するときのような動作を取得することは可能ですか?

post.tags.build name: "whatever"

これは Rails では矛盾していると思います。場合によっては、これを行うためのオプションがあると便利です。

つまり欲しい

post.tags << Tag.first # don't hit the DB here!
post.save # hit the DB here!
4

4 に答える 4

36

これは Rails 3.2 と Rails 4 で動作するはずです:

post.association(:tags).add_to_target(Tag.first)

この要点を参照してください: https://gist.github.com/betesh/dd97a331f67736d8b83a

親を保存すると子が保存され、子を保存するまで child.parent_id は設定されないことに注意してください。

EDIT 12/6/2015: ポリモーフィック レコードの場合:

post.association(:tags).send(:build_through_record, Tag.first)
# Tested in Rails 4.2.5
于 2014-06-25T20:50:51.437 に答える
3
post_tag = post.post_tags.find_or_initialize_by_tag_id(Tag.first.id)
post_tag.save
于 2013-11-12T04:16:40.390 に答える
0

序文 これは、この質問に対する正確な回答ではありませんが、このの機能を探している人にとっては、これが役立つかもしれません。これと他のオプションを非常に慎重に検討してから、必要に応じて実稼働環境に配置してください。

場合によっては、has_one 関係を利用して、必要なものを取得できます。繰り返しますが、これを使用する前に、何を達成しようとしているのかをよく考えてください。

考慮すべきコード からへ のhas_many関係があり、新しいブランチを追加したいと考えています。TrunkBranch

class Trunk
  has_many :branches
end

class Branch
  belongs_to :trunk
end

また、それらを個別に関連付けることもできます。has_oneにリレーションシップを追加しますTrunk

class Trunk
  has_many :branches
  has_one :branch
end

この時点で、次のようなことができTree.new.branch = Branch.newます。すぐには保存されませんが、保存後に から利用できるようになる関係を設定しますTree.first.branches

ただし、これは、新しい開発者がコードを見て、「一体、1 つまたは複数のどちらである必要があるのか​​?」と考えると、かなり混乱する状況になります。

これに対処するために、 とより合理的なhas_one関係を作ることができscopeます。

class Trunk
  has_many :branches

  # Using timestamps
  has_one :newest_branch, -> { newest }, class_name: 'Branch'

  # Alternative, using ID. Side note, avoid the railsy word "last"
  has_one :aftmost_branch, -> { aftmost }, class_name: 'Branch'
end

class Branch
  belongs_to :trunk

  scope :newest, -> { order created_at: :desc }
  scope :aftmost, -> { order id: :desc }
end

これには注意してください。ただし、OP で要求されている機能を実現できます。

于 2016-07-30T20:16:31.333 に答える