【问题标题】:validate on an attribute and has_many through relationship通过关系验证属性和 has_many
【发布时间】:2013-11-12 17:20:49
【问题描述】:

我有以下结构:

class FundFilter < ActiveRecord::Base
  has_many :fund_filter_users, dependent: :destroy
  has_many :users, through: :fund_filter_users
end

class FundFilterUser < ActiveRecord::Base  
  belongs_to :fund_filter
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :fund_filter_users, dependent: :destroy
  has_many :fund_filters, through: :fund_filter_users  
end

我需要的是一个fund_filter的:name上的验证器,它不能对单个用户重复。 FundFilterUser 中单个 user_id 的含义,我需要检查所有fund_filter_ids,其中:该基金过滤器的名称不会重复。

想法?

【问题讨论】:

    标签: ruby-on-rails validation has-many-through validates-uniqueness-of


    【解决方案1】:

    可以实现自定义验证器,检查与用户关联的fund_filters 中的重复名称。

    它可能看起来像这样:

    class User < ActiveRecord::Base
      has_many :fund_filter_users, dependent: :destroy
      has_many :fund_filters, through: :fund_filter_users  
    
      validate :fund_filters, has_uniq_name
    
      def has_uniq_name
        all_fund_filter_from_user = []
        fund_filter_users.each do |fund_filter_user|
          all_fund_filter_from_user = all_fund_filter_from_user.concat(fund_filter_user.fund_filters)
        end
        errors.add(:fund_filters, "cannot have repeated names") unless all_fund_filter_from_user.collect{|p| p.name}.uniq.length == all_fund_filter_from_user.length
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      相关资源
      最近更新 更多