Как проверить, что ассоциация действительна - PullRequest
4 голосов
/ 18 июня 2009

У меня есть модель с именем Profile, которая принадлежит пользователю, так что есть база данных «user_id», которую база данных должна отслеживать. В локальном интерфейсе администратора, который я сделал для этой модели, я хотел обеспечить гибкость, позволяя администратору вводить имя пользователя в поле на экране редактирования, а затем преобразовывать его в user_id для сохранения в контроллере.

Однако вопрос в том, как проверить, что имя пользователя имеет верный возврат? Я обнаружил, что в ActiveRecord :: Validation нет метода для проверки существования ассоциации. Как вы справитесь с такой ситуацией?

Обновление: что я хочу сделать, это проверить, что поле имени пользователя в форме действительно является реальным пользователем, затем я могу сохранить этот user_id обратно в профиль, который администратор редактирует. Здесь «возврат» означает возвращенный объект пользователя.

Ответы [ 2 ]

5 голосов
/ 18 июня 2009

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

class Profile

  belongs_to :user

  # ...

  def username
    user.try(:username)
  end

  def username=(value)
    self.user = User.find_by_username(value)
  end

end

Тогда в твоей форме

<% form_for @profile do |f| %>

  <%= f.text_field :username %>

<% end %>

При отправке значение для поля имени пользователя автоматически передается со всеми другими действительными атрибутами activerecord. ActiveRecord будет искать имя пользователя = setter и разрешит ассоциацию. Если ассоциация возвращает nil (записи с данным именем пользователя не существует), тогда для текущего user_id будет установлено значение nil, и проверка завершится неудачно, как ожидалось.

Возможно, вы захотите настроить код ошибки, чтобы сделать его более значимым.

РЕДАКТИРОВАТЬ: Добавлен пример.

validate :ensure_username_exists 

def username=(value) 
  self.user_id = User.find_by_username(value) || 0 
end 

protected 

  def ensure_username_exists 
    if user_id == 0 # nil is allowed 
      errors.add(:user_id, "Username doesn't exists") 
      return false 
    end
  end
1 голос
/ 18 июня 2009

Это полезная ссылка для ассоциаций активной записи: http://guides.rubyonrails.org/association_basics.html

Чтобы проверить наличие ассоциации, просто проверьте ассоциация .nil?

if @profile.user.nil?
  ... something ...
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...