Только для чтения атрибуты / ключи с MongoMapper - PullRequest
0 голосов
/ 05 февраля 2012

Я хотел бы знать, есть ли способ сделать ключ атрибута доступным только для чтения. Это означает, что он может быть назначен только при создании объекта

ОБНОВЛЕНИЕ : я хочу иметь возможность использовать что-то вроде update_attributes и быть уверенным, что этот метод обновит только тот ключ, который может быть перезаписан. Например, если у меня есть

class User 
    include MongoMapper::Document

    key :firstName, String, :required => true
    key :lastName,  String, :required => true
    key :username,  String, :required => true, :unique => true, :readonly => true
    key :password,  String, :required => true

end

(проверка только для чтения - это псевдокод, я бы хотел, чтобы что-то подобное существовало)

Тогда я ожидал бы, что следующий код вызовет ошибку или потерпит неудачу

user = User.find_by_username("foo")
user.update_attributes({:username => "bar"})
puts "You cannot change the username" unless user.valid?

Мне тоже хотелось бы что-то подобное, но это отдельная вещь

user.update_attributes({:unwantedKey => "fail!"})
puts "You cannot add keys that are not in the User scheme" unless user.valid?

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Я бы повторно рассмотрел ваше требование о том, что вам нужно делать это с валидациями, а не с использованием пользовательской фильтрации контроллера или attr_accessible для управления accessibilty .

Если валидация действительно является правильным решением, то сворачивание собственного типа, например , предполагает, что - хорошая идея, вот некоторый безопасный код идентификации карты для проверки в базе данных:

validate :username_unchanged, :only_existing_keys, :on => :update

def db_version
  # drop to the driver to get around the identity map
  # (identity map is off by default)
  collection.find_one(:_id => self.id)
end

def username_unchanged
  unless username == db_version['username']
    errors.add(:username, 'cannot be changed')
  end
end

def only_existing_keys
  extra_keys = to_mongo.keys - db_version.keys
  unless extra_keys.size == 0
    errors.add(:base, 'You cannot add keys to the schema')
  end
end

Но будь осторожен! MongoMapper не хранит ключи, значение которых nil. Это помешает описанному выше методу only_existing_keys, поэтому вам, возможно, придется где-то хранить массив допустимых ключей.

Надеюсь, это достаточная отправная точка.

0 голосов
/ 05 февраля 2012

вы можете ввести пользовательскую проверку следующим образом:

before_update :check_username
validate :read_only

def check_username
  @temp_username = self.username
end

def read_only
  false if self.username != self.temp_username
end

не уверен, что это сработает, но у вас есть обратные вызовы и проверка, и вы можете использовать обе, чтобы убедиться, что ничего не изменилось.*http://mongomapper.com/documentation/plugins/callbacks.html http://mongomapper.com/documentation/plugins/validations.html

...