如何通过提取另一个模型的名称来确定模型?

时间:2010-08-07 21:27:55

标签: ruby-on-rails ruby model-view-controller model dry

我有几个型号:ContactEmail,ContactLetter,ContactCall

我的控制器不知道传递给它的是什么。它只知道它是一个事件(所以事件可以是ContactEmail,ContactLetter,ContactCall的特定实例)

每个都有不同的属性。 ContactEmail有email_id; ContactLetter有letter_id,ContactCall有call_id。

所以这是我的问题:

对于任何给定的事件实例,如何访问相应的模型和关联的ID?

换句话说,如何从事件中提取模型名称(电子邮件,信件),然后分配正确的ID(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))

我想要做的是找到事件中隐含的相关资产(电子邮件,信函),并获取每个ContactEmail中的email_id(letter_id,voicemail_id)引用的特定资产。

例如:asset = Email.find(ContactEmail.email_id)会给我资产。所以我需要能够动态创建'Email',email_id。我在概念上有这些作品,但它不起作用:(。

授予Chubas ,但想验证这是否是正确的方向(一些其他信息/澄清):

ContactEmail.rb

class ContactEmail

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

这看起来不错吗?

3 个答案:

答案 0 :(得分:2)

你可以用正则表达式

来做
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 :(得分:1)

您可以执行EricBoersma建议的操作,并让每个类实现一个公共接口来获取ID。像这样:

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即可访问正确的ID。

答案 2 :(得分:0)

我建议让所有这些事件类实现一个具有getID()方法的Event接口。每个子类都应实现该方法以返回其特定ID。

但是,我不是Ruby专家,所以我不知道这是否可能。