4

ユーザーが投稿できるアプリをまとめています。各投稿にはタイプ (画像、動画、リンク、テキスト) があり、同様の変数と固有の変数の両方があります。サイト全体で利用できる「コンポーザー」のさまざまなフォームからこれらを送信したいと考えています。

投稿モデル、ギャラリーは次のとおりです。

class Gallery < ActiveRecord::Base
    attr_accessible :name, :asset
    has_attached_file :asset, :styles => { :small => '160x120#', :medium => "500x", :thumb => "300x200#" }
    belongs_to :user
    has_many :likes
    validates :user_id, presence: true
    validates :type, presence: true
    validates :name, presence: true, length: { maximum: 140, minimum: 1 }
end

次のように、単一テーブル継承を使用することを考えていました。

class Image < Gallery
end

class Link < Gallery
end

class Video < Gallery
end

class Text < Gallery
end

しかし、私は望む結果を達成していません。1 つには、Gallery コントローラーで次のようなメソッドを使用したいと考えています。

# galleries_controller.rb
def like 
    @gallery = Gallery.find(params[:id])
    @like = @gallery.likes.build(:user_id => current_user.id)
    respond_to do |format|
        if @like.save
        format.html { redirect_to @gallery }
        format.js
    end
end

終わり

さらに、各投稿タイプのフォームを含み、あらゆる種類の投稿を作成できる「発行者」フォームを作成したいと考えています。

これにどのようにアプローチしますか?私は Rails を初めて使用しますが、Rails が提供するすべての便利さを活用したいと考えています。とても有難い!

4

2 に答える 2

0

Gallery を抽象クラスにし、各サブクラスには個別の db テーブルがあります。これにより、サブクラスに固有の属性と共有属性を持たせることができます。

class Gallery < ActiveRecord::Base
  self.abstract_class = true # very important
  .
  .
end

ギャラリー コントローラーをポリモーフィックにします。

class GalleriessController < ApplicationController
  before_filter :find_gallery

  private

  def find_gallery
    @klass = params[:gallery_type].capitalize.constantize
    @gallery = @klass.find(params[:gallery_id])
  end
end

ビュー:

form_for @gallery を使用できますが、上記のポリモーフィック コントローラーを操作するには、少し操作が必要です。ID だけでなく、gallery_type および gallery_id パラメータを送信する必要があります。これを行うには、form_for の :url パラメータを変更するか、hidden_​​fields を使用します。form_for 内では、サブクラスごとに 1 つずつパーシャルを使用できます。

ルート:

次のように通常のリソースを定義できます: resources :galleries ただし、id パラメータを gallery_id にする必要があります (また、常にgaley_type パラメータを渡します)。これを確認してください:Railsルーティングでidパラメーターを変更する

(あり得る) 結論:

派手なポリモーフィックがうまくいく場合もありますが、それ以外の場合は、サブクラスごとにコントローラーを用意するという、より単純なブルート フォース アプローチの方が適切な場合があります。状況によります。Railsフレームワークが無料で提供していないことをやりすぎた場合は、別のアプローチを考えたほうがよいかもしれません。

于 2012-10-15T18:57:22.690 に答える
0

同様のシナリオがあり、それを実装する良い方法を探した後、使用しているこの宝石を見つけました:

https://github.com/hzamani/acts_as_relation

ポリモーフィックな has_one 関連付けを使用して複数テーブルの継承をシミュレートするため、この場合は次のようにできます。

class Gallery < ActiveRecord::Base
  acts_as_superclass
  ...
end

class Image < ActiveRecord::Base
  acts_as :gallery
  ...
end

class Link < ActiveRecord::Base
  acts_as :gallery
  ...
end

これがお役に立てば幸いです。乾杯!

于 2012-10-16T05:52:43.840 に答える