Как мне динамически назначить модель для .find в Ruby on Rails? - PullRequest
3 голосов
/ 27 мая 2010

Я пытаюсь создать наследование одной таблицы.

Однако, Контроллер должен знать, какой класс найти или создать. Они основаны на другом классе.

Например, ContactEvent с type = Letter должен получить атрибуты из соответствующей модели с именем Letter.

Вот то, что я пытался сделать и наткнулся на загадку, помеченную ниже.

Мне нужно иметь возможность динамически вызывать присвоить значение EventClass, чтобы оно могло быть Letter.find (: условие =>) или Calls.find (: условия =>) в зависимости от того, какой тип контроллера действует.

  def new
    @contact_event = ContactEvent.new
    @contact_event.type = params[:event_type] # can be letter, call, postcard, email
    @contact_event.event_id = params[:event_id] # that ID to the corresponding Model
    @contact_event.contact_id = params[:contact]

    @EventClass = case
      when @contact_event.type == 'letter' then 'Letter'
      when @contact_event.type == 'call' then 'Call'
      when @contact_event.type == 'email' then 'Email'

SNAG НИЖЕ:

    @event = @EventClass.find(@contact_letter.letter_id) #how do I make @EventClass actually the Class?SNAG

    # substitution of variables into the body of the contact_event
    @event.body.gsub!("{FirstName}", @contact.first_name)
    @event.body.gsub!("{Company}", @contact.company_name) 
    @evebt.body.gsub!("{Colleagues}", @colleagues.to_sentence)

    @contact_event.body = @event.body
    @contact_event.status = "sent"

  end

Ответы [ 2 ]

11 голосов
/ 24 марта 2011

Это должно позволить вам динамически вызывать модель, например, с моделью User:

model = "user".capitalize.constantize
model.all

Пример использования:

model = params[:object_type].capitalize.constantize
if model.destroy_all(params[:object_id])
  render :json => { :success => true }
else
  render :nothing => true
end
6 голосов
/ 27 мая 2010
@event_class = case @contact_event.type
  when 'letter' then Letter
  when 'email'  then Email
  when 'call'   then Call
end

Вы должны назначить сам класс, а не строку. Затем вы можете просто позвонить @event_class.find(whatever). Некоторые вещи на заметку:

Поддерживается наследование отдельных таблиц, и оно обрабатывается автоматически Rails. Вы можете иметь Письмо, Электронная почта и Вызов наследовать от ContactEvent. Подробнее на Rails API (раздел Наследование отдельных таблиц)

Вы можете преобразовать вашу строку напрямую, вызвав @contact_event_type.classify.constantize (это превращает "вызов" в Call, например).

Кроме того, попробуйте присвоить переменным имена в соответствии с соглашениями ruby ​​(@event_type вместо @EventType) и проверьте использование оператора case.

Надеюсь, это полезно:)

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