我有几个型号: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
这看起来不错吗?
答案 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专家,所以我不知道这是否可能。