Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 对rails中具有角色的关联进行验证_Ruby On Rails_Validation_Roles - Fatal编程技术网

Ruby on rails 对rails中具有角色的关联进行验证

Ruby on rails 对rails中具有角色的关联进行验证,ruby-on-rails,validation,roles,Ruby On Rails,Validation,Roles,所以我有两个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 #

所以我有两个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

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

您应该可以通过

因此,您的
用户
类最终看起来像

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
class用户“交易”,:foreign\u key=>:买家id
有很多:卖家交易,:class\u name=>“交易”,:foreign\u key=>:卖家id
验证是否存在:name,:if=>:是否有活跃的卖家交易?
验证是否存在:电话,:if=>:是否有活跃的买家交易?
def是否有活跃的卖方交易?
卖家交易数量>0
结束
def是否有活跃的买家交易?
买家交易数量>0
结束
结束

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

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

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
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