Методы динамического поиска для валидации - PullRequest
2 голосов
/ 03 июля 2011

Я использую Ruby on Rails 3.0.7, и я хотел бы найти некоторые записи во время выполнения для целей проверки, но для передачи \ установки значения для этого метода поиска.То есть в моем классе у меня есть следующее:

class Group <  < ActiveRecord::Base
  validates :relation_id,
    :presence  => true,
    :inclusion => {
      :in => ... # Read below for more information about
    }
end

Если я установлю :in равным

:in => User.find(1).group_ids

, это будет работать, но я бы хотел установитьдинамические вещи »для метода поиска вместо значения 1, указанного ниже в примере.То есть я хотел бы сделать что-то вроде следующего, чтобы каким-то образом перейти к модели a <test_value>:

class Group <  < ActiveRecord::Base
  validates :relation_id,
    :presence  => true,
    :inclusion => {
      :in => User.find(<test_value>).group_ids
    }
end

Возможно ли это?Если так, как я могу передать значение константе?

PS: Просто чтобы знать, я пытаюсь сделать это для того, чтобы переместить некоторую логику с контроллера на модель.

Ответы [ 2 ]

1 голос
/ 04 июля 2011

Я предполагаю, что вы пытаетесь заставить что-то вроде «Только пользователи, которые являются членами группы, могут сохранить это». Если это так, у вас есть поведение, которое должно оставаться в контроллере.

Ваша модель не имеет доступа к текущему сеансу, и добавление этой логики не позволит вам использовать вашу модель для других целей в будущем. Например, вы никогда не сможете сохранить группу из пакета или задания по обслуживанию, которые не были связаны с пользователем.

Если вы действительно хотите это сделать, вы можете поместить переменную уровня класса current_user в объект User и установить в before_filter ...

class ApplicationController
  before_fitler :set_current_user
  def set_current_user
    User.current_user = #however you get your user in your controllers
  end
end

class User
  @@current_user
end

class Group
  validates :user_in_group
  def user_in_group
    return true unless User.current_user #if we don't have a user set, skip validation
    User.current_user.group_ids.include? self.id
  end
end
0 голосов
/ 04 июля 2011

Похоже, вы хотите, чтобы для валидатора для атрибута: in выполнялось что-то вроде proc. Я думаю, что вы можете работать с потоками на опасной территории, когда полагаетесь на порядок загрузки моделей и играете с «динамическими константами».

Вместо этого, как насчет создания собственного пользовательского валидатора для этого случая?
Это не так сложно, и вы будете иметь полный контроль над тем, что вам нужно:
http://guides.rubyonrails.org/active_record_validations_callbacks.html#creating-custom-validation-methods

...