Проверить на атрибут и 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
Что мне нужно, так это валидатор:name для fund_filter, который не может повторяться для одного пользователя. То есть для идентификатора пользователя user_id в FundFilterUser мне нужно проверить все fund_filter_ids, где: имя для этого фильтра фонда не повторяется.
Идеи?
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