【问题标题】:Using Rails' build() method through a renamed association通过重命名的关联使用 Rails 的 build() 方法
【发布时间】:2021-03-11 09:19:24
【问题描述】:

我有一个包含

的消息模型
belongs_to :from, class_name: "User"
belongs_to :to, class_name: "User"

当我做类似的事情时

user.messages.build(text: "my message")

如何确保放入“来自”关联的用户是建筑用户? Rails 是如何知道将其放入“from”还是“to”的?

【问题讨论】:

    标签: ruby-on-rails associations


    【解决方案1】:

    我假设Message 上的外键是from_idto_id

    如果您重命名了关联,当您在User 模型中定义messages 关联时,您需要指定foreign_key

    class User < ApplicationRecord
      has_many :received_messages, foreign_key: :to_id, class_name: "Message"
      has_many :sent_messages, foreign_key: :from_id, class_name: "Message"
    end
    

    https://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many

    否则 Rails 会假设您在 Message 上有 user_id,我认为这会引发错误,因为您的 messages 表没有 user_id 列(未经测试)。

    【讨论】:

      【解决方案2】:

      我认为设置message 模型的正确方法是这样的:

      belongs_to :sender, :foreign_key => :sender_id, class_name: 'User'
      belongs_to :recipient, :foreign_key => :recipient_id, class_name: 'User'
      

      你的迁移会是这样的

      create_table :messages do |t|
        t.integer :sender_id
        t.integer :recipient_id
        t.timestamps
      end
      

      那么,在user 模型中:

      has_many :messages, :foreign_key => :sender_id
      

      然后,在message form 中,您可以像这样设置sender

      <%= f.hidden_field :sender_id, value: current_user.id %>
      <%= f.hidden_field :recipient_id, value: @user.id %>
      

      您也可以像在您的示例中这样的问题中设置参数:

      Message.create(sender_id: 1, recipient_id: 3)
      

      这应该让您执行以下操作:

      @message.sender.username
      @message.recipient.username
      

      【讨论】:

        猜你喜欢
        • 2016-12-04
        • 2011-11-17
        • 1970-01-01
        • 1970-01-01
        • 2016-04-09
        • 1970-01-01
        • 2013-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多