以下是我的关联定义:
class Project < ApplicationRecord
has_many :assets
end
class Asset < ApplicationRecord
belongs_to :project
end
现在我想实现资产导入功能,我应该像这样实现它:
# assets_controller.rb
def import
Asset.import(params[:file], @project)
..
end
# asset.rb
def self.import(file, project)
..
end
或如下所示:
# assets_controller.rb
def import
@project.assets.import(params[:file])
..
end
# asset.rb
def self.import(file)
project = self.first.project
..
end
访问模型中关联对象的rails方式是什么,是明确传递还是以其他方式传递?
答案 0 :(得分:3)
我认为最好的方法是为Project模型创建一个导入方法,因为该对象具有执行操作的所有信息:
def import
@project.import_asset(params[:file])
end
...
在project.rb
def import_asset(file)
assets.build(...)
end
@ project.assets.import的解决方案违反了项目对象的封装。
答案 1 :(得分:0)
我认为你在谈论accepts_nested_attributes_for
我回答了一个类似的问题,Create has_many relationships from form
答案 2 :(得分:0)
你不需要这样做。首先要做的事情。您可以使用Rails方式简化所有事情。
#routes.rb
resources :projects do
resources :assets
end
#assets_controller.rb
def import
@project = Project.find params[:project_id]
if @project
@project.assets.create(params[:file]) #specify permitted params
end
end
但是,如果你正在处理多媒体文件,你应该使用一个宝石,比如paperclip或carrierwave。