Rails has_many:検証を通して

私はhas_manyから関連付けまでのモデルの検証に問題があります。関連するモデルは次のとおりです。

ブロードキャストモデル

class Broadcast < ActiveRecord::Base

    attr_accessible :content,
                    :expires,
                    :user_ids,
                    :user_id

    has_many :users, through: :broadcast_receipts
    has_many :broadcast_receipts, dependent: :destroy

    validates :user_id, presence: true
    validates :content, presence: true

end

放送受信モデル

class BroadcastReceipt < ActiveRecord::Base

    belongs_to :broadcast
    belongs_to :user

    attr_accessible :user_id, :cleared, :broadcast_id

    validates :user_id      , presence: true
    validates :broadcast_id         , presence: true
end

また、ブロードキャストレシートを通じて多数のブロードキャストレシートを持つユーザーとの関連があります。

この問題は、次の行にあるように見えます。

validates :broadcast_id         , presence: true

ブロードキャストを作成しようとすると、エラーメッセージが表示されずにロールバックされます。ただし、上記の行を削除すると、すべて正常に動作します。

これは、ブロードキャスト受信が作成される前にブロードキャストが保存されていないという問題のようです。
レシートモデルにbroadcast_idが設定されていることを検証できる方法はありますか?

2
validate:broadcast_id_exists のようなカスタムバリデータを作成して、DBにブロードキャストが存在するかどうかを確認することができます。
追加された 著者 Kaeros,

2 答え

これは、ここで議論されているのと同じ問題です: https://github.com/rails/rails/issues/8828 を追加しました。これは、結合モデルとhas_manyの関連付けを逆にして解決しました。

2
追加された

あなたのコード構造にはいくつか問題があるかもしれません。あなたはこのバージョンを試すことができます。

class Broadcast < ActiveRecord::Base
  # I assume these are the recipients
  has_many :broadcast_receipts, dependent: :destroy
  has_many :users, through: :broadcast_receipts

  # I assume this is the creator
  validates :user_id, :content, presence: true
  attr_accessible :content, :expires, :user_id, :user_ids
end

class BroadcastReceipt < ActiveRecord::Base
  belongs_to :broadcast
  belongs_to :user

  # You should be able to validate the presence
  # of an associated model directly
  validates :user, :broadcast, presence: true

  attr_accessible :cleared
end
1
追加された
私はこれがうまくいかない理由を知りますが、それでもエラーは出ません。興味深いのは、Rails 3.2.11にアップグレードする前に動作していたことですが、変更履歴の中で動作を停止させる何かを見つけることができません。放送が実際に保存される前に領収書を保存しようとしているので、渡すbroadcast_idはありません。
追加された 著者 Ammar,