我是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(整数)。
最后一个问题是如何在主要控制器显示页面中发布评论,并且该特定主要连接到它?
答案 0 :(得分:1)
首先,您确定要在has_and_belongs_to_many
和reviews
之间建立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
财产。
就您希望如何展示它们而言,您可能希望在最初加载专业时包含string
和review
模型(假设您要显示所有评论,尽管如果有很多评论,你最终可能会考虑将它们分成页面):
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
可用方法的更多示例。