Ruby on rails 如何将activerecord关联作为字符串传递给方法?

Ruby on rails 如何将activerecord关联作为字符串传递给方法?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,鉴于以下关联: 用户有许多最终来源 用户有多个预算来源 如何创建以下方法: def foo(source) user = User.find(1) user.source.id end 以致 foo(ultimate_sources) 返回: user.ultimate_sources.id 谢谢。如果source==:ultimate\u sources或source==:budget\u sources,那么以下应该可以使用 user.sendsource.id 如果源是字符串

鉴于以下关联:

用户有许多最终来源

用户有多个预算来源

如何创建以下方法:

def foo(source)
  user = User.find(1)
  user.source.id
end
以致

foo(ultimate_sources)
返回:

user.ultimate_sources.id

谢谢。

如果source==:ultimate\u sources或source==:budget\u sources,那么以下应该可以使用

user.sendsource.id

如果源是字符串,则始终可以使用source.to_sym将其转换为符号

send方法使用表示方法名称的符号,并将消息发送到该对象以执行该方法并返回该方法返回的内容

您可以使用该方法。发送:

或方法。如果源不是用户的方法,则try不会引发NoMethodError:

def foo(source)
  user = User.find(1)
  user.try(source.to_s).id
end
但我真的希望源代码不是来自用户的输入。若我将delete作为源变量的值发送,会怎么样?它将删除用户

我强烈建议您限制可能的方法,在您的情况下,可能是这样的:

def foo(source)
  user = User.find(1)
  user.try("#{source.gsub('_sources', '')}_sources").try(:id)
end
此代码版本保护您将destroy作为源值发送:


为了安全起见,你也可以加入一个保护条款

def foo(source)
   return if (source != 'ultimate_sources') || (source != 'budget_sources')

   user = User.find(1)
   user.send(source).id
end
foo('ultimate_sources') # => user.ultimate_sources.id
foo('destroy') # => nil
foo('destroy_sources') # => nil
foo('budget') # => user.budget_sources.id
def foo(source)
   return if (source != 'ultimate_sources') || (source != 'budget_sources')

   user = User.find(1)
   user.send(source).id
end