2016-05-23 6 views
0

私の主なモデルは、ユーザーがいて、レシピがあるということです。ユーザーあたりの投稿あたりのタグは、ユーザーが表示されていません。

私は、各ユーザーが個々のタグでレシピにタグ付けできるようにタグ付け構造を実装しようとしています。したがって、レシピを表示するときには、自分自身が追加したタグだけが表示されます。

私は2つのモデルハッシュタグとハッシュタグを作成しました。これは結合テーブルです。それはように設定されている:

モデル/ hashtags.rb

class Hashtag < ActiveRecord::Base 
    has_many :hashtaggings 
    has_many :recipes, through: :hashtaggings 
    has_many :users, through: :hashtaggings 
end 

モデル/ hashtagging.rb

class Hashtagging < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :hashtag 
    belongs_to :recipe 
end 

モデル/ recipe.rb

class Recipe < ActiveRecord::Base 
    ... 
    has_and_belongs_to_many :users 
    has_many :hashtaggings 
    has_many :hashtags, through: :hashtaggings 
    .... 
    def all_hashtags=(name) 
     self.hashtags = name.split(",").map do |name| 
     Hashtag.where(name: name.strip).first_or_create! 
     end 
    end 

    def all_hashtags 
     self.hashtags.map(&:name).join(",") 
    end 
end 

class User < ActiveRecord::Base 
    ... 
    has_many :hashtaggings 
    has_many :hashtags, through: :hashtaggings 
    ... 
end 

これは素晴らしい作品しかし、私はハッシュタグを作成するために、私はそれのユーザーアスペクトを組み込む方法を失っています。タグを割り当てる際に、どのようにこれらのタグに現在のユーザを割り当てることができますか? 2つのステップの作成と表示があります

答えて

0

...

作成

あなたは、単にような何かを行うことができないので、この1つは、トリッキーになるだろう...

@recipe.hashtags.create(name: "Tasty as heck!") 

...レシピもハッシュタグもユーザーのことを知らないので、これは2段階のプロセスです。

class RecipeHashtagsController 
    def create 
     current_hashtag = Hashtag.find_or_create_by(name: "Scrumptious!") 
     current_recipe = Recipe.find(params[:recipe_id]) 
     hashtagging = Hashtagging.find_or_create_by(hashtag: current_hashtag, user: current_user, recipe: current_recipe) 
     # redirect_to somewhere_else... 
    end 
end 

私がそこにいたいくつかのこと:

  • 私はあなたが重複したハッシュタグや重複hashtaggingsのいずれかを望んでいないと仮定していますので、私はfind_or_create_byを使用しています。また作成することもできます。
  • 私はあなたがApplicationControllerに何かcurrent_userメソッドを持っていると思っています。
  • 私はあなたがRecipeHashtagsのようなコントローラーを持っていて、nested resourceが一致し、ルートからidを提供すると仮定しています。単純にハッシュタグを作成するのではなく、レシピの特定のコンテキスト内でハッシュタグを作成するので、ここでは入れ子にすることをおすすめします。あなたはしかし、結合テーブルのhashtaggings上の条件付きrecipe.hashtagsを表示したいので、これは、トリッキーな取得

    表示

。これは簡単ではありません。 Recipe上の方法の形態であることができ

@recipe.hashtags_for_user(current_user) 

私は何を考えていることはあなたのような何かをできるようにしたいかもしれないです

... ...。

class Recipe 

    def hashtags_for_user(user) 
    Hashtags.joins(:hashtaggings).where(hashtaggings: { user_id: user.id, recipe_id: self.id }) 
    end 

end 

あなたは(セクション12.3をチェックしてください)the Active Record Querying Rails Guide.whereコール内部ハッシュについての詳細を読むことができます。

編集:コントローラ

ハッシュタグの作成は、それがために作成されていたレシピに依存するので、私は、別のコントローラを指して、ネストされたルートとしてRecipeHashtagsを作成することをお勧めします。あなたはターミナルでrake routesを行うときは、次のようなものが表示されますroutes.rbを

resources :recipes do 
    resources :hashtags, only: [:create] 
end 

... ...

POST /recipes/:recipe_id/hashtags(.:format) recipe_hashtags#create 

注:私はあなたを想定していますリソースのリソースはrecipesです。そうしないと、いくつかのルートが複製され、他の意図しない結果が生じる可能性があります。

Railsのデフォルトの動作は、リソースの定義方法に基づいてrecipe_hashtags_controllerのようなコントローラがあると仮定することです。いつでもこれを無効にすることができます。

+0

すごくありがとう!これは信じられないほどハッシュタグです。私はRecipeHashtagsのためのリソースを持っていないので、私はそれを作成する必要がありますか?基本的に他のモデルを使用するコントローラーですか? – blueduckyy

+0

はい、私はそう思っています...私は詳細を一分で私の答えを更新します。 –

+0

私はそれを得ていると思う。だから基本的にネストされたリソースでは、それを作成するためのURLから:recipe_idを取得します。私は1つの最後の質問があります。これはどのように創造の形に変換されますか?以前はレシピパラメータだったので、簡単にフォームに収めることができました。レシピパラメータとしてall_hashtagsを保持する方法のようには見えません。これは、current_userをモデルに渡すことはできません。では、これをフォームビューにどのように配置しますか? – blueduckyy

関連する問題