Существует ли способ проверить определенный атрибут на ActiveRecord, не инстанцируя объекта сначала?

отметьте нужный элемент вкладки (я предполагаю, что вы хотите открыть упражнение на case 2, если я прав, если нет, измените код соответствующим образом):

@Override
public Fragment getItem(int position) {
    Fragment fragment = null;
    switch (position){
        case 0:
            fragment = new Frag1();
            break;
        case 1:
            fragment = new Frag2();
            break;
        case 2:
            //open new activity
            startActivity(new Intent(CurrentClassName.this, OtherClassName.class));
            break;
        case 3:
            fragment = new Frag4();
            break;
        case 4:
            fragment = new Frag5();
            break;

    }
    return fragment;
}

Пожалуйста, Обязательно измените CurrentClassName на имя класса действия TabLayout и OtherClassName на класс, который вы хотите открыть!

10
задан humanzz 19 January 2009 в 10:58
поделиться

6 ответов

Так как проверки воздействуют на экземпляры (и они используют ошибочный атрибут экземпляра как контейнер для сообщений об ошибках), Вы не можете использовать их, не инстанцируя объекта. Однако можно скрыть это необходимое поведение в метод класса:

class User < ActiveRecord::Base
  def self.valid_attribute?(attr, value)
    mock = self.new(attr => value)
    unless mock.valid?
      return mock.errors.has_key?(attr)
    end
    true
  end
end

Теперь, можно звонить

User.valid_attribute?(:login, "login value")

так же, как Вы предназначили.

(Идеально, Вы включали бы тот метод класса непосредственно в ActiveRecord:: Основа, таким образом, это было бы доступно каждой модели.)

20
ответ дан 3 December 2019 в 14:54
поделиться

Я пошел с пользовательским решением для класса, но я просто хотел удостовериться, что не было никакого лучшего пути

class ModelValidator
  def self.validate_atrribute(klass, attribute, value)
    obj = Klass.new
    obj.send("#{attribute}=", value)
    obj.valid?
    errors = obj.errors.on(attribute).to_a
    return (errors.length > 0), errors 
  end
end

и я могу использовать его как

допустимый, ошибки = ModelValidator.validate_attribute (Пользователь, "вход в систему", "humanzz")

1
ответ дан 3 December 2019 в 14:54
поделиться

Использовать Ваши стандартные стандартные программы проверки:


User.new(:login => 'login_value').valid?

Если это не работает на Вас, создайте пользовательский метод класса для этого:


class User < ActiveRecord::Base

  validate do |user|
    user.errors.add('existing') unless User.valid_login?(user.login)
  end

  def self.valid_login?(login)
    # your validation here
    !User.exist?(:login=> login)
  end
end
3
ответ дан 3 December 2019 в 14:54
поделиться

Реализация 'valid_attribute' метода Вы предлагаете:

class ActiveRecord:Base
  def self.valid_attribute?(attribute, value)
    instance = new
    instance[attribute] = value
    instance.valid?

    list_of_errors = instance.errors.instance_variable_get('@errors')[attribute]

    list_of_errors && list_of_errors.size == 0
  end
end
0
ответ дан 3 December 2019 в 14:54
поделиться
class User < ActiveRecord::Base
  validates_each :login do |record, attr, value|
    record.errors.add attr, 'error message here' unless User.valid_login?(value)
  end

  def self.valid_login?(login)
    # do validation
  end
end

Просто позвоните Пользователю valid_login? (вход в систему), чтобы видеть, допустим ли сам вход в систему

0
ответ дан 3 December 2019 в 14:54
поделиться

Как насчет:

Пользователь columns_hash.has_key? ('вход в систему')

0
ответ дан 3 December 2019 в 14:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: