我有多种多样的关系:
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_parameter
或params.association_parameter
。
答案 0 :(得分:0)
对于集合的过滤 - 比如搜索或者你必须过滤任务的参数 - 我可以建议一种替代方法,即使用params[:q]
代替过滤。
这符合&#34;一些&#34; API过滤的约定,例如ransack
(gem)和ElasticSearch如何使用q
或query
参数,这是作用域的包装参数。
同样,如果遵循这种方法,你的将如下所示
/contacts/1/tasks?q[status_id_is]=1&q[user_id_is]=1
通过这种方式,您现在可以在params.detect
中循环没有问题,因为status_id_is
和user_id_is
将位于params [:q]内,因此更深入了一级哈希,params.detect
循环已经不再考虑。因此,任何MODEL_id
参数都适用于多态路径。