2015-08-01 2 views
0

У меня есть проекционная модель, которая проверяет уникальность атрибута «ppr». Мне не нужны несколько записей Projection, где: week,: player_id,: ppr, AND: created_at год одинаковы. Ключевая проблема заключается в том, что я не знаю, как сделать эту проверку конкретным для created_at year. Я не возражаю, если есть несколько записей, где: ppr,: player_id и: неделя - все равно, если они предназначены для разных дней создания.Rails 3 validates_uniqueness_of для двух атрибутов модели AND created_at year

Например:

Вот запись Проекция.

#<Projection id: 44, ppr: 3.5, salary: 6600, week: 1, created_at: "2014-09-04 06:05:34", player_id: 44> 

Если я хочу, чтобы создать эту дополнительную запись Проекции моей текущая проверка не допустит, даже если created_at год 2015, а не 2014.

#<Projection id: 89, ppr: 3.5, salary: 6600, week: 1, created_at: "2015-09-05 06:05:34", player_id: 44> 

Как изменить свою проверку, чтобы учесть это дополнительное ограничение и разрешить записи из другого года?

я в основном нужно объединить эти два валидаций:

validates_uniqueness_of :ppr, :scope => [:week, :player_id], :if => :nfl? 

validates_uniqueness_of :ppr, conditions: { -> { where("created_at >= ? and created_at <= ?", "#{Date.today.year}0101", "#{Date.today.year}1231") } } 

Добавлено ниже, как я в данный момент у меня есть настройки модели:

class Projection < ActiveRecord::Base 
    attr_accessible :ppr, :salary, :score, :week, :player_id, :created_at 

    belongs_to :player 

    validates_uniqueness_of :ppr, :scope => [:week, :player_id], :if => :nfl? 

    scope :for_year, lambda {|year| where("created_at >= ? and created_at <= ?", "#{year}0101", "#{year}1231")} 
end 

UPDATE

Этот синтаксис не сделал работа по очевидным причинам, но могу ли я сделать что-то подобное этому?

validates_uniqueness_of :ppr, :scope, :created_at => [:week, :player_id, created_at <= ?", "#{Date.today.year}0101", "#{Date.today.year}1231"], :if => :nfl? 

ответ

1

Я рекомендую написать метод проверки, который запрашивает существование такой записи. Поскольку данные уникальны в год, запросите диапазон дат текущего года.

ПРИМЕЧАНИЕ. Это предполагает, что весь ввод данных относится к текущему году, так как ваше условие привязано к атрибуту created_at. Измените переменную range, если вам нужен другой период времени.

class Projection < ActiveRecord::Base 
    belongs_to :player 
    delegate :nfl?, to: :player 

    validates :player, presence: true 
    validate :unique_player_projection, if: :nfl? 

    private 

    def unique_player_projection 
    range = Time.now.beginning_of_year..Time.now.end_of_year 
    return unless Projection.exists?(player_id: player_id, ppr: ppr, week: week, created_at: range) 
    errors.add(:base, 'Projection not unique.') 
    end 
end 

Этот пример является агностиком базы данных. Есть более оптимизированные SQL-запросы, если вы имеете дело с огромными наборами записей.

Я включил делегат для атрибута nfl?.

+0

спасибо @ scarver2 !! – Smooth

Смежные вопросы