Rails方式访问模型中的关联对象?

时间:2017-05-17 16:09:31

标签: ruby-on-rails activerecord

以下是我的关联定义:

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方式是什么,是明确传递还是以其他方式传递?

3 个答案:

答案 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。