访问模型has_many属性

时间:2014-12-30 06:56:13

标签: ruby-on-rails ruby ruby-on-rails-4

我有以下型号:

Post.rb 
   has_many :likes
   belongs_to :user

Like.rb
   belongs_to :user
   belongs_to :post

User.rb
   has_many :posts
   has_many :likes

我试图在视图中查询用户喜欢这样的内容:

<% @user.likes.each do |i| %>
    <%= i.post.title %>
<% end %>

并返回未定义的方法&#39; title&#39;为零:NilClass

我只能达到这样的帖子数组:

<% @user.likes.each do |i| %>
    <%= i.post %>
<% end %>

或者像这样<%= @user.likes.first.post.title %>

我无法理解为什么我无法达到&#34;标题&#34;或任何其他财产。

任何帮助?

2 个答案:

答案 0 :(得分:3)

似乎@user.likes中至少有一个没有关联的帖子。因此,Like#post会返回nil,并且会在nil个对象上尝试调用title,这会引发错误。如果不需要这种情况,您可能需要验证相似内容,以便每个Like都有post

class Like < ActiveRecord::Base
  # ...
  validate :post, presence: true

如果是这样,你可能还应该确保在帖子被销毁时销毁相关的喜欢:

class Post < ActiveRecord::Base
  # ...
  has_many :likes, dependent: :destroy

你也可以只使用相关的帖子来获取喜欢这样的内容:

<% @user.likes.joins(:post).each do |i| %>

或在视图中使用try,以便在没有发布帖子时,不会出现错误:

<%= i.post.try(:title) %>

答案 1 :(得分:0)

如果您的喜欢始终属于帖子,那么最好使用“通过::帖子”选项与建立用户关联。在这种情况下,这是正确的关联方式。

所以你的代码如下:

Post.rb 
   has_many :likes
   belongs_to :user

Like.rb
   belongs_to :post

User.rb
   has_many :posts
   has_many :likes, through: :posts

然后您可以访问用户的喜欢:

<% @user.likes.each do |i| %>
  <%= i.post.title %>
<% end %>

其中包含帖子标题。