从params哈希中提取相关模型

时间:2016-05-13 18:45:40

标签: ruby-on-rails

我有多种多样的关系:

class DocumentTask < ActiveRecord::Base
  belongs_to :task
  belongs_to :document, polymorphic: true
end

class Task < ActiveRecord::Base
  has_many :documents, through: :document_tasks
end

class Contact < ActiveRecord::Base
  has_many :tasks, though: :document_tasks, as: :document    
end

class Service < ActiveRecord::Base
  has_many :tasks, through: :document_tasks, as: :document
end

我有一个看起来像这样的URL,它将信息发送到服务器:

/contacts/1/tasks?status_id_is=1&user_id_is=1

但有时它看起来像这样(因为存在多态关系):

/services/1/tasks?status_id_is=1&user_id_is=1

在我的控制器中,我需要获得该多态关系的对象。通常,我可以执行以下操作:

document_id = params.detect {|name,_| name =~ /(.+)_id/}
@document = document_id[0].gsub("_id","").capitalize.constantize.find(document_id[1])

但是,当url包含查询字符串时,这将不起作用,因为status_id_is和user_id_is将匹配正则表达式。一个明显的解决方案是将正则表达式更改为/^(.+)_id$/但是谁知道可能出现多少其他用例。

有没有一种很好的方式来实现我想要的?例如,请求对象中的某些内容,例如request.association_parameterparams.association_parameter

1 个答案:

答案 0 :(得分:0)

对于集合的过滤 - 比如搜索或者你必须过滤任务的参数 - 我可以建议一种替代方法,即使用params[:q]代替过滤。

这符合&#34;一些&#34; API过滤的约定,例如ransack(gem)和ElasticSearch如何使用qquery参数,这是作用域的包装参数。

同样,如果遵循这种方法,你的将如下所示

/contacts/1/tasks?q[status_id_is]=1&q[user_id_is]=1

通过这种方式,您现在可以在params.detect中循环没有问题,因为status_id_isuser_id_is将位于params [:q]内,因此更深入了一级哈希,params.detect循环已经不再考虑。因此,任何MODEL_id参数都适用于多态路径。