Rails 4一对多关系:从子parent_id属性

时间:2015-09-04 18:28:12

标签: ruby-on-rails ruby-on-rails-4 attributes parent-child one-to-many

我有五个模特:

class User < ActiveRecord::Base
  has_many :administrations
  has_many :calendars, through: :administrations
  has_many :comments
end

class Calendar < ActiveRecord::Base
  has_many :administrations
  has_many :users, through: :administrations
  has_many :posts
end

class Administration < ActiveRecord::Base
  belongs_to :user
  belongs_to :calendar
end

class Post < ActiveRecord::Base
  belongs_to :calendar
end

class Comment < ActiveRecord::Base
  belongs_to :post
  belongs_to :user
end

comment表格包含以下列:idpost_iduser_idbody

在不同的视图中,例如在show.html.erb帖子视图中,我需要使用发布user的{​​{1}}的第一个名称显示相关评论。

换句话说,我正在尝试从comment检索user.first_name

为实现这一目标,我在comment.user_id文件中定义了以下方法:

comment.rb

然后我更新了def self.user_first_name User.find(id: '#{comment.user_id}').first_name end 帖子视图,如下所示:

show.html.erb

当我这样做时,我收到以下错误:

<h3>Comments</h3>
<% @post.comments.each do |comment| %>
  <p>
    <strong><%= comment.user_first_name %></strong>
    <%= comment.body %>
  </p>
<% end %>

我真的不明白为什么我收到与NoMethodError in Posts#show undefined method `user_first_name' for #<Comment:0x007fc510b67380> <% @post.comments.each do |comment| %> <p> <strong><%= comment.user_first_name %></strong> <%= comment.body %> </p> <% end %> 相关的错误。

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

替换:

<强> comment.rb

def self.user_first_name
  User.find(id: '#{comment.user_id}').first_name
end

使用:

<强> comment.rb

delegate :first_name, to: :user, prefix: true

如果你这样做,你可以拨打同一个电话comment.user_first_name,它会给你用户的名字。如果您不希望它在用户没有first_name时中断,请添加, allow_nil: true

您可能还想添加:

has_many :comments

<强> user.rb

class User < ActiveRecord::Base
  has_many :administrations
  has_many :calendars, through: :administrations
  has_many :comments
end