0

私はレールに不慣れで、関連付けを行う方法と、正しく行ったかどうかを正確に理解しようとしています。アソシエーションに関するレールガイドを読み、Webを検索して、いくつかのリソースを見つけましたが、よくわかりません。

ここで私のプロジェクトを見ることができます:majorfinder.com私のアプリには、専攻、学校、およびキャリアがあります。それぞれにレビューを追加できるようにしたいと思います。私は始めたばかりなので、専攻のレビューを追加することから始めています。

これが私の協会です:

models / review.rb

belongs_to :user
has_and_belongs_to_many :majors

models / user.rb

has_many :reviews

models / major.rb

has_and_belongs_to_many :reviews

私の最初の質問は、これは関連付けを作成するための良い方法のように見えますか?

メジャーコントローラーで単純な関連付けを行う方法を理解しています。

@reviews = Review.includes(:user)

それで、私の主要なコントローラーのレビューを表示できます。

<div class="row">
  <% @reviews.each do |review| %>
    <div>
      <h3><%= link_to review.review,
        :controller => "reviews", :action => "show", :id => review.id %></h3>
      <small>Posted on <%= review.created_at %> by
        <a href="#"><%= review.user.profile_name %></a></small>
    </div>
  <% end %>
</div>

しかし、これを私が見ている特定の専攻に接続する方法がわかりません。

私のレビューデータベーススキーマには、review(text)、user_id(integer)、およびmajor_id(integer)があります。

最後の質問は、その特定のメジャーが接続されているメジャーコントローラーのショーページ内にレビューを投稿するにはどうすればよいですか?

4

2 に答える 2

1

まず、との関係has_and_belongs_to_manyが必要ですか?各レビューは1つの特定の専攻(または学校/キャリア)にのみ適用されると思います。その場合、それは1対多の関係であり、とを使用する必要があります。reviewsmajorshas_manybelongs_to

次に、最終的に他のモデルにもレビューを追加したい場合は、他の3つのモデルすべてに同じモデルを使用できるようにするポリモーフィックアソシエーションにすることができます。reviewこれを行うには、関連付けを次のように変更する必要があります。

# In review.rb
belongs_to :reviewable, polymorphic: true

# In major.rb (and later also in school.rb and career.rb)
has_many :reviews, as: :reviewable

また、レビューモデルを変更して、major_idプロパティを持つ代わりに、reviewable_id integerプロパティとプロパティを持つようにする必要がありreviewable_type stringます。

reviewそれらをどのように表示するかという点では、メジャーを最初にロードするときにとモデルを含めることuserをお勧めします(すべてのレビューを表示したいが、最終的にはそれらを分割することを検討したい場合があります)それらがたくさんある場合はページ):

# In majors_controller.rb (or whatever it's named)
def show
  @major = Major.includes(:reviews => :user).find(params[:id])
  ...

次に、ビューで、それらにアクセスするためのreviewsメソッドを@major使用できます(関連付けにより、モデルに多数のメソッドが追加され、モデルを使いやすくなることに注意してください)

# In /app/views/majors/show.html.erb
<div class="row">
  <% @major.reviews.each do |review| %>
    ...
  <% end %>
</div>

または、より便利なことに、パーシャルを使用して(各ページで同じ方法でレビューのリストを表示する場合)、コレクションをレンダリングするためのショートカットを使用できます。

# /app/views/reviews/_review.html.erb
<div>
  <h3><%= link_to review.review,
    :controller => "reviews", :action => "show", :id => review.id %></h3>
  <small>Posted on <%= review.created_at %> by
    <a href="#"><%= review.user.profile_name %></a></small>
</div>

# In /app/views/majors/show.html.erb
<div class="row">
  <%= render @major.reviews %>
</div>
于 2013-03-04T23:30:13.673 に答える
0

これらが適切な関連付けであるかどうかに関しては、すべて、達成しようとしていることと、「現実の」世界での関係が実際にどのように見えるかに依存します。

見た目からすると、アプリには、それぞれが多くの異なるレビューを作成(または持つ)できるユーザーがいて、個々の専攻がそれに関連付けられた多くのレビューを持つことができる専攻があり、個々のレビューが多くの異なる専攻に関連付けられています(つまり、1つのレビューをいくつかの異なる専攻について書くことができます)。

これは正しいです?もしそうなら、あなたが作成しようとしている関連付けは適切であるように思われます。

ただし、実装が完全に整っているかどうかはわかりません。

レビューはユーザーに属しているため、user_id列を含めるのが適切ですが、major_id列を含めることはできません(そうでない場合は、各レビューを1つのメジャーのみに属するように制限します)。

代わりに、MajorsとReviewsの間の関係は、major_id列とreview_id列を持つ結合テーブル(たとえば、major_reviews)を介して管理されます。この結合テーブルはもう作成しましたか?

アソシエーションを正しく設定すると、クエリの実行に関して生活を楽にするための多くのrailsメソッドにアクセスできるようになります。

たとえば、特定のユーザーのすべてのレビューを取得するために、次のことができます@user.reviews。同様に、個々のレビューに関連する専攻を取得するには@review.majors、または特定の専攻のすべてのレビューを取得するには、を実行できます@major.reviews

Railsガイドhttp://guides.rubyonrails.org/association_basics.html#the-has_and_belongs_to_many-association@majorで利用可能なメソッドの例をさらに見ることができます。@review

于 2013-03-04T23:35:23.497 に答える