0

假设我正在跟踪电子邮件通信。询问(来自客户)或回复(来自支持者)嵌入在双方对应的顺序中。它们在放入数据库时​​共享完全相同的逻辑。

我的问题是即使我使用相同的逻辑,对象类不同,我需要调用的模型字段不同,方法名称也不同。

在我实际必须使用它们之前,如何将方法和对象引用放入其中?是否存在“string_to_method”方法或类似的方法?

带注释的示例代码:

class Email
  include Mongoid::Document

  field :from, type: String
  field :to, type: String
  field :subject, type: String

  belongs_to :order, :inverse_of => :emails

  def start
    email = Email.create!(:from => "sender@example.com", :to => "recipient@example.com", :subject => "Hello")

    from_or_to = from                  # This represents the database field from where I later on will fetch the customers email address. It is either from or to.
    enquiries_or_replies = enquiries   # This represents a method that should later be called. It is either enquiries or replies.

    self.test_if_enquiry_or_reply(from_or_to, enquiries_or_replies)
  end

  def test_if_enquiry_or_reply(from_or_to, enquiries_or_replies)
    order = Order.add_enquiry_or_reply(self, from_or_to, enquiries_or_replies)
    self.order = order
    self.save
  end
end

class Order
  include Mongoid::Document

  field :email_address, type: String

  has_many :emails, :inverse_of => :order
  embeds_many :enquiries, :inverse_of => :order
  embeds_many :replies, :inverse_of => :order

  def self.add_enquiry_or_reply(email, from_or_to, enquiries_or_replies)
    order = Order.where(:email_address => email.from_or_to).first  # from_or_to could either be from or to.
    order.enquiries_or_replies.create!(subject: email.subject)     # enquiries_or_replies could either be enquiries or replies.
    order
  end
end
4

2 回答 2

1

从问题和代码示例来看,听起来您的顾虑太多了。我的第一个建议是重新评估您的方法名称和对象结构。test_if_thing1_or_thing2像和这样的模棱两可的名字from_or_to(它应该只是一件事)会让其他人和你未来的自己很难理解最后的代码。

但是,在不深入讨论关注点分离的情况下,您可以通过使用public_send(或私有感知send)更改您调用的方法。所以你可以做

order.public_send(:replies).create!

order.public_send(:enquiries).create!
于 2013-05-07T16:04:22.233 回答
0

字符串到方法确实存在,它被称为eval

所以,你可以做

method_name = "name"
eval(method_name) #calls the name method
于 2013-05-07T16:41:55.887 回答