1

я иметь следующую структуру:проверки по атрибуту и ​​has_many через отношения

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, который не может повторить для одного пользователя. Значение для одного user_id в FundFilterUser, мне нужно проверить все fund_filter_ids, где: имя для фильтра фонда не повторяется.

Идеи?

ответ

0

Возможно реализовать пользовательский валидатор, который проверяет наличие дубликатов имен в 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