Как я могу определить модель, извлекая название другой модели? - PullRequest
1 голос
/ 08 августа 2010

У меня есть несколько моделей: ContactEmail, ContactLetter, ContactCall

Мой контроллер не знает, что ему передают. Он знает это только как событие (поэтому событие может быть конкретным экземпляром ContactEmail, ContactLetter, ContactCall)

Каждый из них имеет свой атрибут. У ContactEmail есть email_id; У ContactLetter есть letter_id, у ContactCall есть call_id.

Так вот мой вопрос:

Как получить доступ к соответствующей модели и соответствующему идентификатору для любого данного экземпляра события?

Другими словами, как я могу извлечь из события Имя модели (Email, Letter), а затем назначить правильный идентификатор (email_id, letter_id), чтобы затем найти нужную запись?

Я начал со следующего:

      model = event.class # this will show ContactPostalcard  
      puts event.send('contact_id')
      puts model
      short_model_name = model.name.sub('Contact','') 


      puts short_model_name
      short_model = short_model_name.class

      key_name = short_model_name.foreign_key
      puts key_name
      asset_id = event.send("#{key_name}")
      puts asset_id

      asset = short_model_name.send(find.send(asset_id))

Что я хочу сделать, так это найти связанный ресурс (Email, Letter), который неявно присутствует в событии, и получить конкретный ресурс, на который ссылается email_id (letter_id, voicemail_id), который есть в каждом ContactEmail.

Например: asset = Email.find (ContactEmail.email_id) даст мне актив. Поэтому мне нужно было бы иметь возможность динамически создавать «Email», email_id. У меня есть части концептуально, но это не работает: (.

Присуждается Чубасу, , но хотел проверить, правильное ли это направление (некоторая дополнительная информация / уточнение):

ContactEmail.rb

class ContactEmail

   def get_asset
       email_id = self.email_id
       asset = Email.find_by_email(email_id)
       return asset
   end
end      

Это выглядит правильно?

Ответы [ 3 ]

2 голосов
/ 08 августа 2010

Вы можете сделать это с помощью регулярного выражения

event.class.name.gsub(/Contact/, '').downcase + '_id'

Но, конечно, я более сторонник добавления метода contact_field_id во все эти классы и просто создаю model_name = event.contact_field_id.Не только чище, но и более масштабируемо.

РЕДАКТИРОВАТЬ:

Кажется, вы пытаетесь вставить логику в контроллер, чтобы найти правильный экземпляр для получения из базы данных.Это должно соответствовать не контроллеру, а модели.Следуя тому, что я предлагал ранее, я сделаю:

class ContactEmail
  def contact(id)
    Email.find_by_email_id(id)
  end
end

class ContactLetter
  def contact(id)
    Letter.find_by_letter_id(id)
  end
end

Так что вам не нужно беспокоиться о поиске подходящего класса, просто позвоните @event.contact(id).Возможно, это то, что вы ищете

1 голос
/ 08 августа 2010

Вы можете сделать то, что предлагает EricBoersma, и заставить каждый класс реализовать общий интерфейс для получения идентификатора.Примерно так:

class ContactEmail
  def contact_id
    email_id
  end
end

class ContactLetter
  def contact_id
    letter_id
  end
end

class ContactCall
  def contact_id
    call_id
  end
end

Тогда просто используйте event.contact_id везде, где вам нужно получить доступ к нужному идентификатору.

0 голосов
/ 08 августа 2010

Я бы предложил, чтобы все эти классы событий реализовали интерфейс Event, который имеет метод getID ().Каждый из подклассов должен реализовывать этот метод для возврата своего конкретного идентификатора.

Однако я не эксперт по Ruby, поэтому не знаю, возможно ли это.

...