В Rails 3 как вы можете получить доступ к user_id последнего пользователя в базе данных в вашей модели? - PullRequest
0 голосов
/ 22 января 2011

Редактировать См. Ниже:

class Post < ActiveRecord::Base
  last_user_id = User.last.id
  validates_inclusion_of :user_id, :in => 0..last_user_id
end

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

Я работаю над учебником (rails 3.0.3) и последние полчаса пытался выяснить, как сказать rails, что один из классов в моей модели должен убедиться, что: user_id находится в диапазоне от нуля до user_id последнего пользователя в базе данных.

Я знаю, что мне нужно использовать:

validates_inclusion_of :user_id, :in 0..(can't figure out this piece)

Я смог легко убедиться, что введенный номердля User_ID в числовом виде с:

validates_numericality_of :user_id

Я ищу информацию о том, где это исследовать, я внимательно изучил документацию по валидаторам ActiveRecord и не нашел там много.

Ответы [ 4 ]

1 голос
/ 22 января 2011

Что произойдет, если пользователь удалит свою учетную запись?Неужели вы просто не хотите проверять существование пользователя?

class Post < ActiveRecord::Base
  belongs_to :user
  validates_presence_of :user
  ...

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

class Post < ActiveRecord::Base
  include ActiveModel::Validations
  validates_with UserIdValidator
  ...

class UserIdValidator < ActiveModel::Validator
  def validate(record)
    max_user = User.find(:one, :order=>["id"])
    unless(user_id > max_user.id && user_id > 0)
      record.errors[:base] << "This record is invalid"
    end
  end
end

Но я до сих пор не совсем понимаю, зачем вам это нужно - есть ли что-то особенное в вашем идентификаторе пользователя?Я бы порекомендовал первый подход.

0 голосов
/ 22 января 2011

Почему бы не использовать validates_uniquness_of :user_id?

Если предположить, что диапазон 0..the_latest_user_id содержит все существующие идентификаторы пользователей, то вы просто смотрите, является ли он уникальным. Определение его уникальности - это то же самое, что и определение того, находится ли он в этом диапазоне.

0 голосов
/ 22 января 2011

Поскольку вы просто делаете это ради обучения:

(A) Проверьте «последний идентификатор», предполагая, что это «наибольшее значение идентификатора»:

class Post < ActiveRecord::Base
  last_user_id = ActiveRecord::Base.connection.select_one('SELECT MAX(ID) AS "MAX_ID" FROM users')["MAX_ID"]
  validates_inclusion_of :user_id, :in => 0..last_user_id
end

или

(B) MAX () получит максимальное значение поля идентификатора.Эта может не обязательно быть "последней" вставленной записью.Если вы действительно хотите, чтобы «последний пользователь был вставлен», вы можете сделать это (проверяет самое позднее время вставки записи):

class Post < ActiveRecord::Base
  last_user_id = ActiveRecord::Base.connection.select_one('SELECT ID AS "LAST_ID" FROM users WHERE created_at = (SELECT MAX(created_at) from users LIMIT1)')["LAST_ID"]
  validates_inclusion_of :user_id, :in => 0..last_user_id
end
0 голосов
/ 22 января 2011

Диапазон от нуля до последнего идентификатора пользователя? Единственный способ - написать новый валидатор.

Я не понимаю вашу цель, но посмотрите validates_associated.

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