我认为我应该为此使用多态,但是当我尝试找到可以解决它的代码时,它就没有用。
简而言之,我正在创建一条消息,并且希望它 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 %>
答案 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 %>