Ruby on Rails。 模型关联
我有一个Model, file.rb
,一个控制器, filecontroller.rb
,和一个名为files
的表视图的集合。 这样做是为了能够上传Excel文件,以便我可以在某人上传Excel文件的索引视图中查看列表,创build时间以及上传Excel文件的人员的姓名。
现在,我还有另一个Model, bottle.rb
,一个控制器,一个bottlecontroller.rb
,以及一个视图集合,这个视图在数据库中叫做bottles
。 数据库中瓶表中的列与Excel文件相同。
我已经有能力上传Excel文件后,一些validation,以便他们可以进入数据库中的files
表。 而且我也遵循了rails的教程,能够从瓶子索引视图中导入一个excel文件并更新我的bottles
表格。
不过,我希望能够上传一个Excel文件,并在文件索引视图中导入信息。 但import也需要更新瓶子表中的信息。 换句话说,从文件索引视图导入Excel需要能够更新瓶表数据库。
我知道我需要我的files.rb
模型和bottles.rb
模型之间的关联..但任何帮助将是可怕的!
************更新后的问题************************************ *****
在我的filecontroller.rb
,保存后在create方法中添加了@file.bottles = Bottle.import(params[:file_url])
。 我将excel文件存储在:file_url
。 我还在has_many :bottles
file.rb
模型中添加了一个关联
def create ......... .......... if file.save @file.bottles = Bottle.import(params[:file_url]) end end
在我的瓶子模型bottle.rb
我有
def self.import(file_url) spreadsheet = Roo::Excel.new(file_url.path, packed:nil,file_warning: :ignore) ......... bottle.save! end
但是我得到了一个未定义的方法path' for nil:NilClas error in this line
spreadsheet = Roo :: Excel.new(file_url.path,packed:nil,file_warning::ignore)`这不认可file_url作为Excel的path文件。
有两种方法:在控制器中执行或在模型中使用callback。
如果您只需要在用户从特定视图导入时执行此操作,则可以在控制器内处理该操作。 例如,如果在索引文件视图中上传excel文件,则会调用files_controller.rb中的“create”操作,您可以执行如下操作:
if @file.save # update bottle database using data from @file end
但是,如果您希望在每次创build新文件时完成此操作,则可以通过视图或不在视图中添加after_create
callback到您的file.rb模型。 如果您希望在保存后每次都完成,则可以执行after_save
callback。
好的在if @file.save
我添加了Bottle.import(@file.file_url.path)
而在bottle.rb
模式中,我改变了
spreadsheet = Roo::Excel.new(file_url.path, packed: nil,file_warning: :ignore)
至
spreadsheet = Roo::Excel.new(file_url, packed: nil,file_warning: :ignore)
和BOOM!