0

我是 Rails 的新手,并试图准确了解如何进行关联,以及我是否正确地完成了它。我已经阅读了有关关联的 Rails 指南并搜索了网络并找到了许多资源,但我不确定。

你可以在这里看到我的项目:majorfinder.com 在我的应用程序上会有专业、学校和职业。我希望能够为每个添加评论。因为我刚刚开始,所以我刚开始为专业添加评论。

以下是我的联想:

模型/review.rb

belongs_to :user
has_and_belongs_to_many :majors

模型/用户.rb

has_many :reviews

模型/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之间建立关系吗?我会假设每条评论只适用于一个特定的专业(或学校/职业),如果是这种情况,它是一对多的关系,你会想要使用and 。reviewsmajorshas_manybelongs_to

其次,考虑到您最终还想为其他模型添加评论,您可能希望将其设为多态关联,这将允许您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属性。

就您希望如何显示它们而言,您可能希望在最初加载专业时包含reviewuser模型(假设您想显示所有评论,尽管您最终可能希望将它们拆分为如果有很多页面):

# 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

至于这些是否是适当的关联,这完全取决于您要达到的目标以及这些关系在“真实”世界中的实际样子。

从它的外观来看,在您的应用程序中,您有用户,每个用户都可以创建(或拥有)许多不同的评论,您有专业,每个专业可以有许多与之关联的评论,并且您有评论,其中每个单独的评论是与许多不同的专业相关联(即一篇评论可以写几个不同的专业)。

这个对吗?如果是这样,那么您尝试创建的关联似乎是合适的。

但是,我不确定您是否完全了解实施情况。

评论属于用户,因此它有 user_id 列是合适的,但是它不应该有一个 major_id 列(否则你将每个评论限制为只属于一个专业)。

相反,专业和评论之间的关系是通过连接表(例如major_reviews)管理的,该表将具有major_id 和review_id 列。您是否已创建此连接表?

正确设置关联后,您将可以访问许多 rails 方法,以使您在运行查询时更轻松。

例如,为了获得给定用户的所有评论,您可以这样做@user.reviews。类似地,要获得相关专业的个人评论,您可以做@review.majors,或者要获得给定专业的所有评论,您可以做@major.reviews

您可以在 Rails 指南http://guides.rubyonrails.org/association_basics.html#the-has_and_belongs_to_many-association的第 4.4.1 节中看到更多可用方法的@major示例。@review

于 2013-03-04T23:35:23.497 回答