Simple Rails 3 Association - has_many,belongs_to和has_and_belongs_to_many

时间:2013-03-04 22:51:57

标签: ruby-on-rails ruby-on-rails-3 associations

我是rails的新手,并试图了解如何做关联以及我是否已正确完成。我已阅读rails guide on associations并在网上搜索并找到了一些资源,但我不确定。

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

以下是我的协会:

models / review.rb

belongs_to :user
has_and_belongs_to_many :majors

模型/ user.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>

但我不确定如何连接到我正在查看的特定专业。

我的评论数据库架构有审核(文本),user_id(整数)和major_id(整数)。

最后一个问题是如何在主要控制器显示页面中发布评论,并且该特定主要连接到它?

2 个答案:

答案 0 :(得分:1)

首先,您确定要在has_and_belongs_to_manyreviews之间建立majors关系吗?我认为每个评论仅适用于一个特定的专业(或学校/职业),如果是这样的情况,它是一对多的关系并且你想要使用{{1 }和has_many

其次,鉴于您最终还想将评论添加到其他模型中,您可能希望将其设为polymorphic association,这样您就可以使用相同的belongs_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财产。

就您希望如何展示它们而言,您可能希望在最初加载专业时包含stringreview模型(假设您要显示所有评论,尽管如果有很多评论,你最终可能会考虑将它们分成页面):

user

然后在您的视图中,您可以使用# In majors_controller.rb (or whatever it's named) def show @major = Major.includes(:reviews => :user).find(params[:id]) ... reviews方法来访问它们(请记住模型的关联add a bunch of methods以便更轻松地使用它们)

@major

或者更方便的是,你可以使用部分(如果你想在每个页面上以相同的方式显示评论列表),并使用快捷方式来呈现集合:

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

答案 1 :(得分:0)

关于这些是否是适当的关联,这一切都取决于你想要达到的目标以及在“真实”世界中关系的实际情况。

从它的外观看,在你的应用中你有用户,每个用户可以创建(或拥有)许多不同的评论,你有专业,每个专业都可以有很多与之相关的评论,你有评论,每个个人评论与许多不同的专业相关(即一篇评论可以写成几个不同的专业)。

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

但是,我不确定你是否真的在实施。

审核属于用户,因此它具有user_id列是合适的,但它不应该有major_id列(否则您将每个审核限制为只属于一个主要部分)。

相反,Majors和Reviews之间的关系是通过连接表(例如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可用方法的更多示例。