2017-05-17 16 views
2

次は私の団体が定義されている方法です。モデルの関連オブジェクトにアクセスする方法を教えてください。

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 

モデル内の関連するオブジェクトにアクセスするためのレールの方法は、明示的に、または他の方法で通過していますか?

答えて

3

私が操作を行うためのすべての情報を持つオブジェクトであるため、最善の方法は、プロジェクトのモデルにインポート方法を作成することであると思う:project.rb

def import_asset(file) 
    assets.build(...) 
end 

def import 
    @project.import_asset(params[:file]) 
end 

... 

@ project.assets.importを持つソリューションは、プロジェクトオブジェクトのカプセル化に違反します。

+0

を呼び出すと、import_asset(file)を呼び出すと読みやすくなります – s1mpl3

+0

はい、同意します。投稿を更新しました –

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のような宝石を使用する必要があります。

関連する問題