2016-02-26 3 views
0

У меня есть два символа, значения которых заданы пользователем.Проверка ActiveRecord: максимальная длина одного символа для значения минус длина другого символа

Мне нужно проверить их длину. Максимальная длина каждого символа должна составлять 32 минус длина другого символа.

Я написал это так до сих пор, но это не работает. Есть ли у кого-нибудь предложения о том, как это может работать?

validates :id, presence: true, uniqueness: { scope: :name }, length: { maximum: 32 - :name.length } 
validates :name, uniqueness: { scope: :id }, length: { maximum: 32 - :id.length } 

NB: Я только закончил, так что есть большой шанс, я сделал это совершенно неправильно, потому что я все еще учусь, и на самом деле не понимают символы еще.

ответ

0

Похоже, вам нужны пользовательские проверки здесь:

validates :id, presence: true, uniqueness: { scope: :name } 
validates :name, uniqueness: { scope: :id } 
validate :name_and_id_max_length 

def name_and_id_max_length 
    if (id || '').length + (name || '').length > 32 
    errors.add(:base, "id and name combined must be 32 or fewer characters") 
    end 
end 

Btw: в Rails Обычно id является целым числом, но вы, кажется, рассматривая его как строку. Это говорит о некоторой путанице.

Также :id.length не имеет отношения к Ruby. В этих объявлениях validates вы вызываете класс методов, поэтому нет экземпляра с id. Чтобы сделать арифметику против фактических значений, вам понадобится proc. Rails не поддерживает это здесь AFAIK, но и в других контекстах это полезный шаблон вставлять фрагменты каждого экземпляра вычислений, которые вы объявляете на уровне класса:

validates :name, length: { maximum: proc { 32 - id.length } } 

Например, для реального примера:

scope :recent, -> { where("created_at > ?", 24.hours.ago) } 
+0

Думаю, вы должны написать 'id.to_s'. –

+0

Также уникальность проверки 'id' не нужна. :) Уникальность в' name' прекрасна. Не нужно расширять ее с помощью 'id'. –

+1

Как @Arup asys, если' id' на самом деле является вашим основным ключом , как обычно в Rails, добавление '{scope: id}' к ограничению уникальности на 'name' неверно, потому что два одинаковых имени всегда будут« уникальными »из-за их разных' id '. –

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