我正在为 ruby on rails 使用这个文件上传器。我上传了一些带有数字的文件用于统计分析。文件模型称为filedb。在filedb.rb 中打开文件并分析数字(一些相关的东西等)。之后,我需要将结果保存到一个名为 results 的表中。
仅在filedb.rb中写入是否聪明:
@cell=Results.new(:cell_name =>filenames, :icorrelation=>intensities)
@cell.save
还是使用results_controller在表中创建记录比较好?
并到这样的事情:
results_controller.rb:
def create
@result = Result.new(params[:result])
if @result.save
lalala
else
render :new
end
end
虽然我不知道如何将参数 :result 传递给 Controller
提前致谢
编辑:
fieldbs_controller.rb:
def analyse
(filedb.where(analyse:no)).perform_analysis
respond_to do |format|
format.html { redirect_to :back }
end
end
归档文件
def self.perform_analysis
list=Analysis.do_number_analyse
if list!=nil
results(list)
end
end
def self.results(list)
do somthing with list
cell=Results.new(:cell_name =>filenames, :icorrelation=>intensities)
cell.save
end
Analysis.do_number_analysis - 是另一个模型中的一种方法,所有计算都在这里完成
最佳答案
您的第一种方法应该没问题,您可以从文件模型中保存结果。
你不需要使用实例变量@,因为它被认为是将变量发送到 View ,我无法想象你为什么需要在这里。
总结一下,在filedb.rb中:
# here you calculations and then
cell = Result.new(cell_name: filenames, icorrelation: intensities)
cell.save!
小心模型,应该是单数(结果,而不是结果)。
如果您使用保存!方法,用“!”保存新单元格时,您将看到 Controller 抛出的任何错误。
希望有帮助
在 KATJA 之后编辑
我对如何到达 FieldsController 中的分析操作有点迷茫,我猜你是在成功上传文件后将浏览器发送到那里。假设您公开的代码应该可以正常工作。
尽管如此,确实看起来有点复杂,也许您可以通过更简单的方式达到相同的结果。
由于我不知道你的整个代码,也许我遗漏了一些东西,但我所做的是摆脱分析操作并通过 Filedb 模型中的 after_create 回调处理单元格创建。
class Filedb < ActiveRecord::Base
# associations, validation and accessible stuff goes here, and then:
after_create :perform_analysis
protected
def perform_analysis
list = Analysis.do_number_analyse
results(list) unless list.nil?
end
def results(list)
# I assume that here you are using 'list' to get 'filenames' and 'intensities' values, and then:
cell = Result.new(cell_name: filenames, icorrelation: intensities)
cell.save!
end
end
after_create 回调只在实例创建时触发,所以这里比 after_save 好。
这样,您不需要在 Controller 中进行任何“分析”操作,因为在每个文件创建后都会自动调用“perform_analysis”方法;您的代码在模型中紧密结合在一起,如果您需要返回并更改某些内容,您可以在将来轻松查看流程。
说得通?
关于ruby-on-rails - Ruby on Rails,从另一个模型创建记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16416069/