【问题标题】:Rails has_many :through validationRails has_many:通过验证
【发布时间】:2013-02-07 09:59:11
【问题描述】:

我无法通过关联从 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

通过广播收据与拥有_many广播收据的用户也有关联。

问题似乎与以下行有关:

validates :broadcast_id         , presence: true

每当我尝试创建广播时,我都会得到回滚,但没有给出错误消息。但是,当删除上述行时,一切都按预期工作。

这似乎是在创建广播收据之前未保存广播的问题。
有什么方法可以验证在收据模型上设置了 broadcast_id 吗?

【问题讨论】:

  • 您可以创建一个自定义验证器,例如:validate :broadcast_id_exists 并在 DB 中存在广播时检查您的验证。

标签: ruby-on-rails validation has-many-through


【解决方案1】:

这似乎与此处讨论的问题相同:https://github.com/rails/rails/issues/8828,已通过将 :inverse of 添加到连接模型的 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
    

    【讨论】:

    • 我明白为什么这应该工作,但它仍然没有,它回滚没有错误。有趣的是,它在升级到 Rails 3.2.11 之前可以正常工作,但我在更改日志中找不到任何会导致它停止工作的内容。在实际保存广播之前,它仍在尝试保存收据,因此它没有要传入的广播 ID。
    猜你喜欢
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 2016-07-24
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    相关资源
    最近更新 更多