16

「RailsWay」は外部キー制約を使用しないように思われるため、オブジェクトをTableBに保存する前に、外部キーが参照する行が実際にTableAに存在することを検証できる代替手段を探しています。 table_a_idを使用します。

これまでにこれを行うために私が見つけた唯一のリソース(2007年の日付のブログ投稿へのリンクが見つかりません)はRails 3.2と互換性がないようですので、誰かが方法を提案できますか?これをやっていますか?

現在、モデル内の関連する属性に手動で割り当てるバリデーターの作成を検討していますが、validate_each(object、attribute、value)を使用してそれを行う方法を理解できません。

4

6 に答える 6

37

以下のように使用するだけです。

validates :user, presence: true

db内のユーザーレコードの存在を自動的にチェックします。

Active Record検証presenceからの参照- :

アソシエーションが存在することを確認したい場合は、アソシエーションのマッピングに使用される外部キーではなく、関連するオブジェクト自体が存在するかどうかをテストする必要があります。このようにして、外部キーが空でないことだけでなく、参照されるオブジェクトが存在することもチェックされます。

于 2014-04-23T19:58:29.673 に答える
8

これをbelongs_toアソシエーションに役立てるプラグインがあります:の存在を検証します。しかし、多分あなたはあなた自身の検証を加えることができますか?このようなものはどうですか?

# Assuming your foreign key is user_id (which references the table User)
validate :user_id_exists

def user_id_exists
  return false if User.find_by_id(self.user_id).nil?
end
于 2012-06-16T09:36:59.987 に答える
4

このコードで問題が発生しました:

return false if User.find(self.user_id).nil?

一致するレコードが見つからなかった場合、ActiveRecord例外をキャッチする必要がありました。なし?レコードが見つからない場合は機能しません。例外はnilの前にスローされますか?実行されます。

# Assuming your foreign key is user_id (which references the table User)
validate :user_id_exists

def user_id_exists
  begin
    User.find(self.user_id)
  rescue ActiveRecord::RecordNotFound
    errors.add(:user_id, "user_id foreign key must exist")
    false
  end
end

これは、 invalidを使用するときに役立ちますか?単体テストでのアサーション。

request.user_id = unknown
assert request.invalid?

request.user_id = 1
assert request.valid?
于 2012-12-30T05:06:47.140 に答える
3

Rails 3.2の時点では、validates_presence_ofはこの場合は希望どおりに機能し、上記の回答のような複雑な構造を構築したり、素敵なvalidates_existence_ofgemを使用したりする必要はありません。

于 2013-10-25T00:24:52.747 に答える
2

inverse_ofオプションを指定し、その存在が真であることを検証する必要があります。

Active Record検証ガイドから:

プレゼンスが必要な関連付けられたレコードを検証するには、関連付けに:inverse_ofオプションを指定する必要があります

于 2015-01-28T01:28:16.393 に答える
1

私は例外が嫌いです。私はこれを行うことでこの問題を解決しました:

class Foo < ActiveRecord::Base

    validate :bar_exists

    protected

    def bar_exists
        if !User.where(bar_id: self.bar_id).exists? then
            errors.add(:bar_id, 'A valid bar_id is valid.')
        end
    end

end
于 2013-09-24T06:26:17.807 に答える