0

所以我有两个 ActiveRecord 类

class User < ActiveRecord::Base
  has_many :buyer_deals, :class_name => "Deal", :foreign_key => :buyer_id
  has_many :seller_deals, :class_name => "Deal", :foreign_key => :seller_id

  validates_presence_of :name # THIS SHOULD ONLY BE RUN IF USER IS A SELLER
                              # IN THE DEAL
  validates_presence_of :phone # THIS SHOULD ONLY BE RUN IF USER IS A BUYER
                              # IN THE DEAL
end

class Deal < ActiveRecord::Base
  belongs_to :seller, :class_name => 'User'
  belongs_to :buyer, :class_name => 'User'

  validates_associated :seller
  validates_associated :buyer
end

我想做的是创造一个新的交易。

Deal.create(A NICE STRUCT WITH SELLER AND BUYER)

但是,如果交易的关系是卖家,我只想运行名称验证,如果交易的关系是卖家,我只想运行名称验证,这在 Rails 中是否可行,似乎在文档中找不到任何内容。

4

2 回答 2

1

您应该能够通过向您添加条件验证来做到这一点。

所以,你的User班级最终会看起来像......

class User < ActiveRecord::Base
  has_many :buyer_deals, :class_name => "Deal", :foreign_key => :buyer_id
  has_many :seller_deals, :class_name => "Deal", :foreign_key => :seller_id

  validates_presence_of :name, :if => :has_an_active_seller_deal?
  validates_presence_of :phone, :if => :has_an_active_buyer_deal?

  def has_active_seller_deals?
    seller_deals.count > 0
  end

  def has_active_buyer_deals?
    buyer_deals.count > 0
  end
end

一种替代方法是简单地要求所有用户在任何时候都有一个姓名和电话号码存档(无条件验证),并且只向他们有活跃交易的其他用户透露,而不是作为用户的一部分公开个人资料,从而尽可能保护用户的隐私。这可能会更简单。

于 2012-08-07T22:00:19.523 回答
-1

您可以将验证放在回调中:

before_save :check_user_type

private
def check_user_type
  user_type = self.responds_to?(seller_id) ? :seller : :buyer
  if user_type == :seller
    validates_presence_of :name 
  else 
    validates_presence_of :phone
  end
于 2012-08-07T22:17:02.190 回答