【问题标题】:Multi-Table Rails Query多表 Rails 查询
【发布时间】:2016-12-04 21:43:34
【问题描述】:

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

我试图在我的消息视图中显示消息发件人的姓名,该视图保存在用户模型中。但是,无论我尝试如何执行此操作,我都会遇到错误 - 我不确定我是否坚持“Rails 方式”。

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

消息字段是:id, sender_id, subject, bodysender_id 是一个用户 FK

Message_Recipient 字段是:id, user_id, message_iduser/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 获取用户名的值。

任何帮助/最佳实践建议将不胜感激!

【问题讨论】:

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


    【解决方案1】:

    关联可以很棘手,但无需过多考虑。你只需要两个模型,用户和消息。 Messages 表将包含标题、文本、receiver_id 和 sender_id。 (听起来发件人会从数据库中的收件人下拉列表中进行选择。选择后,该人的 user_id 将被标记,并且 current_user 的 user_id 将设置为发件人的 id 另一个字段:示例 Message.create((id will be automatic) sender(current_user user_id) recipient (user_id), text: "Have a nice day") 在用户模型中:拥有和属于消息;在消息模型中:属于用户。 在您的控制台中尝试一下。

    【讨论】:

    • 这是否适用于发送给多个用户的消息?顺便说一句,谢谢你的回答!
    • 是的,查看如何保存到 user_ids 数组(你使用的是 postgresql,对吗?)
    • 我用的是sqlite3,你觉得会一样吗?非常感谢
    • 坦率地说,我不知道,但升级到 postgresql 并不难。这些是你要发送的即时消息吗?如果是,并且您使用的是 Rails 5,您可能想查看一些有关 ActiveCable 的教程(我对此一无所知;从未看过有关它的教程)。它可能是所有这些问题的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多