我们继承了rails项目(整个基于elasticsearch)。因此,应用程序列出了用户满足所提供的搜索标准的所有文档。想象一下,一旦你选择了一个方面,即一个特定的日期范围,它会为你提供当时创建的文件。
我们目前正在努力扩展其功能:
我们的首要任务是 利用弹性查询 ,以便 全部 该查询匹配的 文档可以 多次修改 (在 我们的情况,我们一直试图隐藏所有文件)。然后我们想要将查询发送到适当的rake任务来处理它。
点击负责大量隐藏的按钮后,控制器的create方法被调用,从而在数据库中创建一个mass_hiding
记录(为方便起见,我们会跟踪隐藏信息,以便我们恢复之后的群众行动)。
def create
mh = current_user.mass_hidings.build(params[:mass_hiding])
mh.save!
mass_hide(mh.query_params)
redirect_to search_documents_path(mass_hide.search_parameters)
end
def mass_hide(query)
search = factic.create_restrictions_search(MultiJson.load(query.to_json))
Resque.enqueue(Document::Jobs::HideDocuments, nil, search.to_scrollable.build_query)
end
但是,创建方法mass_hide(mh.query_params)
的 3 行会在执行后触发以下异常:
Admin :: MassHidingsController #creore中的ArgumentError 错误的参数数量(0表示1)
可以找到完整跟踪 here。
Parameters:
{"utf8"=>"✓",
"authenticity_token"=>"6mZvRcp4HJuoBWMRToA2gPec9Wv8T82hiTJQ/STf1j/sDhQ+16mBW3QkRmhqlJIHKR0kvX/kqwQh205hp6RuDg==",
"mass_hiding"=>{"serialized_query_params"=>"{}",
"description"=>"test"},
"commit"=>"Hide documents"}
此外,这里是mass_hiding
的架构表示以及相应的模型:
schema.rb
create_table "mass_hidings", force: :cascade do |t|
t.integer "user_id"
t.text "serialized_query_params"
t.string "description"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
mass_hiding.rb
class MassHiding < ActiveRecord::Base
attr_accessible :serialized_query_params, :description
belongs_to :user
def query_params=(params)
self.serialized_query_params = Oj.dump(params)
end
def query_params
Oj.load(self.serialized_query_params).with_indifferent_access
end
def self.find_or_initialize_by_user_and_query_params(user, query_params)
self.find_or_initialize_by_user_id_and_serialized_query_params(user.id, Oj.dump(query_params))
end
end
提前感谢您的帮助。
答案 0 :(得分:2)
问题是你已经定义了这个辅助函数:
def mass_hide(query)
但是你用零参数调用它。
当你说mass_hide(mh.query_params)
时,首先用一个参数调用它。没关系。
然后在下一行你也会说mass_hide.search_parameters
。 Ruby意味着mass_hide().search_parameters
。也许你打算写mh.search_parameters
?我不确定。但是mass_hide
是需要1个参数的方法,而且是传递它的调用点0。
我希望有所帮助!