【问题标题】:Active Record has_many :messages not saving records properlyActive Record has_many :messages 没有正确保存记录
【发布时间】:2019-11-18 07:51:36
【问题描述】:

我正在构建一个带有 Active Record 的 sinatra 应用程序。这个想法本质上是拥有一个自定义电子邮件应用程序。这里我有模型用户和消息。一个User has_many :messages 和一个Message belongs_to :user。这可能是我遇到问题的地方。我还为Message belongs_to :userhas_many :users 设置了它。 这是模型

现在,当我在动作控制器中创建消息时,我正尝试使用 shove 方法将新消息放入用户的消息数组中。如果我尝试使用params( @user = User.find(id) 中的所有用户ID 一次与多个用户“共享”此消息,然后user.messages << @new_message) 最后一个用户将把消息存储在它的.messages 数组中。但是只有最后一个要迭代。

class Message < ActiveRecord::Base
   belongs_to :user 
   has_many :users
end  
class User < ActiveRecord::Base
    validates :username, presence: true, uniqueness: true
    has_secure_password
    has_many :messages  
end

这个想法是作者“拥有”消息,但可以与许多用户分享。这是表格

class CreateUsers < ActiveRecord::Migration
  def change 
    create_table :users do |t|
      t.string :username 
      t.string :email 
      t.string :password_digest
    end
  end
end
class CreateMessages < ActiveRecord::Migration
  def change 
    create_table :messages do |t| 
          t.string :message 
           t.string :author
           t.integer :user_id 
           t.integer :user_ids
           t.integer :share_id
           t.string :title 
           t.timestamps
  end
end 
end
# action controller 
 new_params = {}
      new_params[:message] = params["message"]
      new_params[:title] = params["title"]
      new_params[:author] = params["author"]
      new_params[:user_id] = params["user_id"] 
      @message = Message.create(new_params)
      # @share = Share.create 
      # @message.share_id = @share.id
      response.map do  |x| 

        x.messages << @message 
        x.save!
      end 
      @all = User.all 

      @user = User.find_by(username: @message.author) 
      erb :"/user/sent" 

我很确定这是因为我的关联设置不正确。

【问题讨论】:

    标签: ruby activerecord sinatra sinatra-activerecord


    【解决方案1】:

    您需要在用户和消息之间建立“拥有-属于-多”的关系,才能实现将多条消息共享给多个用户。创建附加记录,例如MessageShare 双方都有很多事情要做:

    class MessageShare < ActiveRecord::Base
      belongs_to :user
      belongs_to :message
    end
    
    class Message < ActiveRecord::Base
      has_many :message_shares
    end
    
    class User < ActiveRecord::Base
      has_many :message_shares
    end
    

    message_shares 表应该有user_idmessage_id 整数列。

    【讨论】:

    • 你看起来像个高手。我不确定如何实现这一点。我尝试了这个,也没有让它工作。
    • 我有一个分享、消息和用户模型。我尝试将几个多个 user.id 添加到操作控制器中的 share.user_ids 中。这些尝试都行不通。我不太确定如何访问用户和消息。在我知道 has_many :messages 给用户 user.messages 方法之前。
    • sitepoint.com/…stackoverflow.com/questions/5120703/…。如果没有帮助,请回来提出新问题 :)
    猜你喜欢
    • 2012-01-01
    • 1970-01-01
    • 2012-10-24
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    相关资源
    最近更新 更多