Rails多态设置错误?

时间:2018-07-24 02:33:42

标签: ruby-on-rails polymorphism

我认为我应该为此使用多态,但是当我尝试找到可以解决它的代码时,它就没有用。

简而言之,我正在创建一条消息,并且希望它 1)属于向导或成员 2)has_one行程或竞标

当我尝试保存新消息并尝试通过消息引用视图中的指南的“ first_name”时,出现回滚错误,我得到以下错误:

undefined method `guide' for #<Message:0x0000000487bd48>
Did you mean?  guide_id

这些是我的模特:

class Guide < ApplicationRecord
  has_many :messages, as: :messageable
end

class Member < ApplicationRecord
  has_many :messages, as: :messageable
end

class Message < ApplicationRecord
  belongs_to :messageable, polymorphic: true
  has_one :bid or :trip
end

这是用于显示first_name的代码段,因为消息msg.message的显示非常正确。

<% if @bid.messages.present? %>
  <% @bid.messages.each do |msg| %>
    <p>From: 
    <% if msg.guide_id.present? %>
      <%= msg.guide.first_name %>
    <% elsif msg.member.present? %>
      <%= msg.member.first_name %>
    <% end %>
  </p>
  <p>Message: <%= msg.message %></p>
<% end %>
<% else %>
  <p>No messages</p>
<% end %>

1 个答案:

答案 0 :(得分:0)

您始终会引用多态名称,因此,您无需使用msg.guide.first_name,而是使用:msg.messageable.first_name

也许也值得分享您的数据库迁移。在代码中,您正在检查:guest_id,它不应该是消息模型的一部分。应该只有一个名为messagable_id的属性,因此可以简化视图:

<% if @bid.messages.present? %>
  <% @bid.messages.each do |msg| %>
    <p>From: <%= msg.messageable.first_name %></p> 
  <p>Message: <%= msg.message %></p>
<% end %>
<% else %>
  <p>No messages</p>
<% end %>