【问题标题】:validates_presence_of and unsaved associationsvalidates_presence_of 和未保存的关联
【发布时间】:2012-05-25 12:07:30
【问题描述】:

获取以下代码(Rails 3.0.10):

User < AR
  has_many :providers

Provider < AR
  belongs_to :user
  validates_presence_of :user

user = User.new
user.providers.build
# so both models not yet saved but associated with each other

user.valid?
=> false

user.errors
=> {:providers=>["is invalid"]}

user.providers.first.errors
=> {:user_id=>["can't be blank"]}

为什么 Provider 看不到它有一个尚未保存的关联用户模型可用?或者换句话说 - 我该如何处理才能使验证仍然存在?还是我做错了什么?

请注意,我正在寻找一个干净的解决方案,因此建议在 Provider 模型中使用验证前回调将 User 模型保存到数据库中是不行的。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 validation activerecord


    【解决方案1】:

    使用 :inverse_of

    class User < ActiveRecord::Base
      has_many :providers, :inverse_of => :user
    end
    
    class Provider < ActiveRecord::Base
      belongs_to :user, :inverse_of => :providers
      validates :user, :presence => true
    end
    

    【讨论】:

    • 在 Rails 中是个坏主意——有什么证据吗?
    • 经验丰富。 OP的代码不起作用等事实。
    • “坏主意”... pff。这与嵌套属性基本上是一样的——你认为它们也是一个坏主意吗?无论如何,长话短说,确切地说是针对 Omniauth 和 Twitter。我不能在事务中滚动它,因为这发生在请求之间——因为 Twitter 不提供电子邮件,我不想保存空的用户记录。所以我需要先构建两个模型,并且只有当它们都有效时才保存。哦,不是我在打 .save 电话。设计就是这样做的。
    • 好的。您可以使用另一种解决方案。
    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多