Ruby on rails Ruby on Rails,从另一个模型创建记录

Ruby on rails Ruby on Rails,从另一个模型创建记录,ruby-on-rails,Ruby On Rails,我正在为RubyonRails使用这个文件上传程序。我上传了一些带有数字的文件进行统计分析。文件的模型称为filedb。在filedb.rb中,打开文件并分析数字(一些相关信息等)。之后,我需要将结果保存到一个名为results的表中 仅在filedb.rb中编写以下内容是否明智: @cell=Results.new(:cell_name =>filenames, :icorrelation=>intensities) @cell.save # here you calculati

我正在为RubyonRails使用这个文件上传程序。我上传了一些带有数字的文件进行统计分析。文件的模型称为filedb。在filedb.rb中,打开文件并分析数字(一些相关信息等)。之后,我需要将结果保存到一个名为results的表中

仅在filedb.rb中编写以下内容是否明智:

@cell=Results.new(:cell_name =>filenames, :icorrelation=>intensities)
@cell.save
# here you calculations and then
cell = Result.new(cell_name: filenames, icorrelation: intensities)
cell.save!
或者最好使用results\u controller在表中创建记录? 对于这样的事情: 结果_controller.rb:

  def create
    @result = Result.new(params[:result])    
    if @result.save
     lalala     
    else
      render :new
    end
  end
  def analyse

   (filedb.where(analyse:no)).perform_analysis

     respond_to do |format|
       format.html { redirect_to :back }
     end

  end
虽然我不知道如何将参数:result传递给控制器

提前谢谢

编辑:

filedbs_controller.rb:

  def create
    @result = Result.new(params[:result])    
    if @result.save
     lalala     
    else
      render :new
    end
  end
  def analyse

   (filedb.where(analyse:no)).perform_analysis

     respond_to do |format|
       format.html { redirect_to :back }
     end

  end
filedb.rb

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-是另一个模型中的一种方法,在该模型中,所有计算都已完成

是否存在
@user
?如果不是,则未定义用户。这会给您带来错误。

您的第一种方法应该是正确的,您可以保存文件模型的结果

您不需要使用实例变量@,因为它被认为是将变量发送到视图的,我无法想象您为什么需要在这里这样做

总之,在filedb.rb中:

@cell=Results.new(:cell_name =>filenames, :icorrelation=>intensities)
@cell.save
# here you calculations and then
cell = Result.new(cell_name: filenames, icorrelation: intensities)
cell.save!
小心使用模型,应使用单数形式(结果,而不是结果)。 如果你使用save!方法,使用“!”可以看到控制器在保存新单元格时抛出的任何错误

希望有帮助

在KATJA编辑后编辑

关于FieldsController中的分析操作是如何到达的,我有点不知所措,我猜您是在成功上传文件后将浏览器发送到那里的。假设您公开的代码应该正常工作

尽管如此,它看起来确实有点复杂,也许你可以用一种更简单的方法得到同样的结果。 由于我不知道您的全部代码,也许我遗漏了一些东西,但我要做的是摆脱分析操作,并通过Filedb模型中的创建后回调处理单元格创建

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
classfiledb
after_create回调仅在创建实例时触发,因此这里比after_save更好

这样,您就不需要在控制器中执行任何“分析”操作,因为每次创建文件后都会自动调用“执行分析”方法;您的代码在模型中紧密地结合在一起,如果您需要返回并更改某些内容,您可以在将来很容易地看到流程


有意义吗?

但这将是一种聪明的方式来做我想要的事情,或者控制器的故事更适合这样做?我认为你的方法非常好。@Katja你能分享你的fieldb.rb模型文件吗?我在回答中假设您是在回调中进行计算的,否则可能会进入fieldb控制器。@Katja我已经根据您的反馈编辑了答案,希望现在是clearer@Galen这是有意义的,除非我不需要像用户应该定义的那样在创建回调后定义何时执行分析(这是一个很长的故事,为什么)但由于在results表中创建新记录没有生效,我喜欢您的答案=)