1

なぜ

@thing.tag_ids = params[:thing][:tag_ids]

リレーションをデータベースに一度に保存しますが、

@thing.update_attributes(params[:thing][:tag_ids])

検証が失敗した場合はありませんか?

@thing.update_attributes(params[:thing][:tag_ids])

と同じです

@thing.tag_ids = params[:thing][:tag_ids]
@thing.save

ではない?

4

3 に答える 3

0

私もそのような行動に苦しんでいます...

コード:

@thing.tag_ids = params[:thing][:tag_ids]

DB アドホックで変更を行い、検証を呼び出さないため、次のようになります。

@thing.update_attributes(params[:thing][:tag_ids])

とは異なります

@thing.tag_ids = params[:thing][:tag_ids]
@thing.save

要するに:

@thing.tag_ids = params[:thing][:tag_ids] # makes changes in DB w/o validations
@thing.save # runs validations before making changes to DB

また、使用時に検証を実行する可能性があるかどうかも尋ねています。

@instance.collection_singular_ids = other_singular_ids

簡単な修正として、オーバーライド メソッドを親モデル (「もの」) に次のように追加しました。

def tag_ids=(ids)
  super
rescue ActiveRecord::RecordInvalid => e
  self.errors.add(:base, e.message)
end

次のように、結合モデルでタグの重複を防ぐための検証ツール:

validates :tag_id, :uniqueness => {:scope => :thing_id}

誰かがより良い修正をしていますか?

于 2015-04-29T10:16:31.350 に答える