11

次のような ActiveRecord アソシエーションがあるとします。

class City < ActiveRecord::Base
  belongs_to :state
end

州のない都市は無効です。これらの両方が可能な検証であるようです:

validates :state,    presence: true
# OR
validates :state_id, presence: true

次の理由から、それらは同一であると思います。

  • belongs_toメソッドstateを作成し、state=
  • state=を設定しますstate_id

ただし、オブジェクトの代わりに ID をチェックするように仕様を変更することで、失敗した仕様を修正しました。

両方を検証するこれら2つの方法は受け入れられますか? もしそうなら、いつどちらを使いますか?

4

4 に答える 4

16

validates :state都市から州への関係(belongs_to)を外部キーとともに使用しますが、validates :state_id単独では列state_idを使用して、値があるかどうかを確認します。

stateキーと関係の両方が存在する必要があるため、(関係を)検証することをお勧めします。

state_id の検証は、州 ID が存在することを確認するという点で機能しますが、コードの有効性、つまり City の特定の州キーに対して州が実際に「存在する」ことはチェックしません。

基本的に、City で使用される外部キー (state_id 用) がすべて State に実際のレコードとして存在する場合、効果は同じです。州に無効な州コードがある場合、違いが表示されます。

于 2012-07-27T20:43:10.973 に答える
1

あなたが何かをした場合はどうなりますか

s = State.new
c = City.new
c.state = s
c.valid?

私はこれを試していませんが、c.state_id の存在を確認している場合、c には状態がありますが (ID がまだ生成されていないため)、存在しないと推測しています。状態はまだ保存されていません)。

つまり、状態の存在に関心がある場合は、状態の存在を検証する必要があります。

于 2012-07-27T21:20:05.357 に答える
-1

Rails 4 Way by Obie Fernandezによると:

関連付けが存在することを確認しようとしている場合は、関連付け変数自体ではなく、その外部キー属性を渡します

validates :region_id, :presence => true
validate :region_exists

def region_exists
  errors.add(:region_id, "does not exist") unless Region.exists?(region_id)
end

この本では、なぜこれを使用する必要があるのか​​ について説明していません。

validates :region, :presence => true

しかし、私はこれらの人が自分のことを知っていることを知っています。

于 2015-04-15T21:27:58.943 に答える