0

私のアプリにはアイテムがあり、make_flaggable gem を使用してそれらのアイテムを「お気に入り」としてマークできます。

すべてのユーザーが自分のお気に入りのアイテムを見ることができるページを作成したいと考えています。

どんな助けでも大歓迎です!

item.rb

make_flaggable :favorite

user.rb

make_flagger

items_controller.rb

def favorite
  @current_user = User.first  
  @item = Item.find(params[:id])
  @current_user.flag(@item, :favorite)
  redirect_to @item, :notice => "Added to Your Favorites"
end

def unfavorite
  @current_user = User.first  
  @item = Item.find(params[:id])
  @current_user.unflag(@item, :favorite)
  redirect_to @item, :notice => "Removed from Your Favorites"
end
4

1 に答える 1

2

make_flaggable gem は、次のスキーマにリンクflaggablesするデータベース テーブルを生成します。flaggers

flaggings
  flaggable (polymorphic)
  flagger (polymorphic)
  reason
  timestamps

そして対応するモデル:

class MakeFlaggable::Flagging < ActiveRecord::Base
  belongs_to :flaggable, :polymorphic => true
  belongs_to :flagger, :polymorphic => true
end

と を呼び出すmake_flaggablemake_flagger、次の関係がユーザーとアイテムに追加されます。

class Item < ActiveRecord::Base
  has_many :flaggings, :class_name => "MakeFlaggable::Flagging", :as => :flaggable
end

class User < ActiveRecord::Base
  has_many :flaggings, :class_name => "MakeFlaggable::Flagging", :as => :flagger
end

だから、私たちは関係を築きたいと思っていUser -> Flagging -> Flaggableます。残念ながら、flaggable関係はポリモーフィックであるため、単純にユーザーに追加することはできません。

has_many :flagables, through: :flaggings

ただし、アイテムにフラグを立てるだけなので、ソース タイプを明示的に設定できます。

class User < ActiveRecord::Base
  has_many :flagged_items, :through => :flaggings, :source => :flaggable, :source_type => 'Item'
end

これで、次のようなコントローラー メソッドを使用できます。

@current_user = User.first
@items = @current_user.flagged_items
于 2013-04-23T18:24:01.943 に答える