活动记录has_many:消息未正确保存记录

时间:2019-11-18 07:51:36

标签: ruby activerecord sinatra sinatra-activerecord

我正在使用Active Record构建一个sinatra应用。这个想法实际上是要有一个自定义的电子邮件应用程序。这里有用户和消息模型。 User has_many :messagesMessage belongs_to :user。这可能是我遇到的问题。我也为Message belongs_to :userhas_many :users设置了它。 这是模型

现在,当我在动作控制器中创建消息时,我试图使用shove方法将新消息放入用户的message数组中。如果我尝试一次与多个用户“共享”此消息,并且所有用户ID都位于params( @user = User.find(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" 

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

1 个答案:

答案 0 :(得分:0)

您需要在用户和消息之间具有“一对多”的关系,才能实现与多个用户共享多条消息。创建其他记录,例如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整数列。