2011-01-12 5 views
0

私は4つのモデルを扱っています。私は、アカウント、場所、タグ、およびタグ付けモデルを持っています。私はそれが場所のページにあるフォームを作成するときに私がいる問題があるRails - 多数あり:複数のモデルが混乱している

class Tag < ActiveRecord::Base 

    # belongs_to :shelter 
    has_many :taggings, :dependent => :destroy 
    has_many :locations, :through => :taggings 
    has_many :accounts, :through => :taggings 

end 

class Tagging < ActiveRecord::Base 

    belongs_to :location 
    belongs_to :tag 
    belongs_to :shelter 

end 

class Account < ActiveRecord::Base 
    has_many :taggings, :dependent => :destroy 
    has_many :tags, :through => :taggings, :dependent => :destroy 
end 

class Location < ActiveRecord::Base 
    has_many :taggings, :dependent => :destroy 
    has_many :tags, :through => :taggings, :dependent => :destroy 
end 

create_table :taggings, :force => true do |t| 
    t.references :account 
    t.references :location 
    t.references :tag 
    t.timestamps 
end 

を次のように私はそれを設定しています。私は場所にタグを付けることができるが、それはアカウントに関連付けられているし、フォームとコントローラロジックを正しく行う方法のロジックに苦労している。

私は/ location/1/tagsネストフォーム。しかしコントローラでは、タグを正しく追加する方法を理解できないようです。ここに私のTagsControllerです

def create 
    @tag = Tag.find_or_create_by_name(params[:tag][:name]) 
    @location = @current_account.locations.find(params[:location_id]) 
    @location.tags << @tag 
end 

それは働いていますが、複数の行を作成しています。私は、タグを作成し、タグ付けに場所、アカウント、タグを割り当てることができるようにしたいと思います。

+0

あなたはBELONGS_TO持っているどのように来る:あなたのタグ付けモデルで避難所を。それはbelongs_to:accountではありませんか? – JosephL

+0

ジョセフあなたは正しいです...それはカットアンドペーストでうんざりでした...アライブな試合は – bokor

答えて

1

どの程度

@tag = Tag.find_or_create_by_name(params[:tag][:name]) 
@location = @current_account.locations.find(params[:location_id]) 
@tagging = Tagging.create(:tag => @tag, :location => @location, :shelter => @current_account) 
+0

魅力のように働いた。私はあなたがTagging.createそのようにすることができるかどうか分からなかったので、このヒントをありがとう。私は他のコードを整理しなければならないので、今私はもっと仕事をしたようです。 – bokor

+0

これをフォームから実行することをお勧めしますか。私は同様の設定で持っている別の同様のオブジェクトを持っています。プレースメントが呼び出されたので、プレースメントをフォーム内に新しく作成し、上記のような変数を設定していた場合は、非表示フィールドとしてフォームに設定するか(クエリを最小限に抑えるため)、コントローラでの検索 – bokor

+0

わかりませんつまり、フォームがレンダリングされる前(隠しフィールドの値を設定する前)、またはフォームがポストされた後(モデルインスタンスを取得するため)に同じ数のクエリを実行しているようです。 「早すぎる最適化がすべての悪の根源」であることを考えれば、実際には問題が発生するまで、いくつかのクエリを保存することを心配する必要はありません(もちろん、ループなどで不必要なクエリを実行している場合を除きます)。 –

関連する問題