1

ユーザーは を介し​​てクリップをアップロードできます。このクリップはおよび または(ショー コントローラ、アルバム コントローラ) にClips Scaffold属します。ShowAlbum

ユーザーは持つことができます

  • オンリーワンショー
  • 多くのアルバム

    私が達成しようとしていること:

ユーザーはクリップをアップロードできます。これらのクリップは、ショーまたはアルバムのいずれかに添付できます。

より詳細な概要については、以下の画像をご覧ください。 ここに画像の説明を入力

問題 #1私が理解していないのは、私が使用しなければならない関連付けです。私の現在のモデル:

ユーザーモデル:

has_many :clips, dependent: :destroy
has_one :show, dependent: :destroy
has_many :albums, dependent :destroy

クリップ モデル:belongs_to :user

モデルを表示:belongs_to :user

アルバムモデル:belongs_to :user

---------------------------------------------------------------------------------

問題 2ユーザーがクリップをアップロードするときに、それをショーまたはアルバムに添付 (または割り当て) できるようにする方法がわかりません。

ショーで行ったこと (1 つしかないため) は、ビュー ページで <%= @user.clip %> を呼び出すことだけでした。

つまり、ユーザーがアップロードしたすべてのクリップが番組に表示されます。

どちらが間違っている...

ショーアルバムができたので、ユーザーがそれをどこに添付するかを選択できるようにする必要があります (彼が持っている多くのアルバムの 1 つ、または彼のショー)。

または、ユーザーがAlbumsまたはShowコントローラーを介してクリップをアップロードできるソリューションを使用する必要があります(別のClips Controllerを介するのではありません) 。

ここで本当に助けが必要かもしれません:)

4

2 に答える 2

1

あなたの問題#1は、ポリモーフィックアソシエーションの教科書的なケースです。

class User < ActiveRecord::Base
  has_one         :show,
                  :dependent => :destroy
  has_many        :clips,
                  :dependent => :destroy
  has_many        :albums,
                  :dependent => :destroy
end

class Clip < ActiveRecord::Base
  belongs_to      :user
  belongs_to      :attachable,
                  :polymorphic => true
end

class Show < ActiveRecord::Base
  belongs_to      :user
  has_many        :clips,
                  :as => :attachable
end

class Album < ActiveRecord::Base
  belongs_to      :user
  has_many        :clips,
                  :as => :attachable
end

Rails Guidesでポリモーフィック アソシエーションの詳細を学ぶことができます。

問題#2については、上記のリンクされたガイドに従って移行を行うと仮定すると、clipsテーブルに2つのデータベースフィールドがあります。

  • attachable_id- これは、関連付けを受け取る予定のまたはidのインスタンスです。ShowAlbum
  • attachable_type- これは対象オブジェクトのクラス名なので、 または のいずれShowAlbumです。

アップロード フォームで、番組やアルバムのリストを表示し、とクラス名を にid割り当てます。attachable_idattachable_type

ユーザーが2番目のオプションを選択した場合に備えて、最初の選択を1つのクラスのみでロードし、JavaScriptを介してその内容を置き換えることをお勧めします。そのようです:

<%= f.collection_select :attachable_type, [['Show'], ['Album']], :first, :first, { :selected => 'Show' }, { :include_blank => false } %>
<%= f.collection_select :attachable_id, Show.all, :id, :name %>
于 2013-09-15T14:20:33.267 に答える
0

それらがすべてユーザーのものでなければならない何らかの理由がない限り、clipモデルをより有効に活用することで、これを大幅に簡素化できると思います。

関係を次のように変更します。

ユーザー.rb

has_many :clips, dependent: :destroy

Clip.rb

belongs_to :user
has_one :show
has_many :albums

Show.rb

belongs_to :clip

アルバム.rb

belongs_to :clip

を使用してショーを表示し、 を使用clip.showしてアルバムを表示clip.albumsできます - 個々のアルバムは を使用して呼び出すことができますclip.albums.find(params[:id])

于 2013-09-14T12:55:45.520 に答える