多表Rails查询

时间:2016-12-04 21:43:35

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

我是rails的新手,我的应用中有一些has_many through:关系。 我有User, MessageMessage_Recipients个模型(用户有很多邮件,邮件有一个发件人,邮件有很多收件人 - message_recipients是连接表)。

我正在尝试在我的消息视图中显示消息发件人的姓名,该视图保存在用户模型中。但是,无论我尝试做什么,我都会遇到错误 - 我不确定我是否坚持“Rails Way”。

用户字段为:id, forename, surname, email

消息字段为:id, sender_id, subject, body sender_id是用户FK

Message_Recipient字段为:id, user_id, message_id user / message_id为FK

以下是我的模特(我也在使用Devise):

class Message < ActiveRecord::Base
  belongs_to :user, :class_name => User, :foreign_key => "sender_id"#sender
  has_many :message_recipients
  has_many :users, through: :message_recipients
end



class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_many :message_recipients
  has_many :messages, through: :message_recipients
end



class MessageRecipient < ActiveRecord::Base
  belongs_to :message, :class_name => Message, :foreign_key => "message_id"
  belongs_to :user, :class_name => User, :foreign_key => "user_id"
end

这是我的消息/ index.html.erb:

<% @messages.each do |message| %>
  <div class="message">
    <h2><%= message.subject %></h2>
    <p>Sent by <%= message.user.forename %></p>
  </div>
<% end %>

我认为由于获得NoMethodError而无法根据发送邮件的人的sender_id获取用户名字的值,因此我遇到了麻烦。

非常感谢任何帮助/最佳实践建议!

1 个答案:

答案 0 :(得分:0)

关联可能很棘手而不会过度思考。您只需要两个模型,用户和消息。 消息表将包含标题,文本,recipient_id和sender_id。 (听起来像发件人会从数据库中的收件人下拉列表中选择。一旦选择该人的user_id将被标记,并且current_user的user_id将被设置为发件人的id另一个字段:示例 Message.create((id将是自动的)sender(current_user user_id)收件人(user_id),文本:“祝你有愉快的一天”) 在用户模型中:拥有并属于消息;在消息模型中:属于用户。 在你的控制台中尝试一下。