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