【问题标题】:Rails: After creating a record (e.g. a user) update another table (e.g. not the users table)?Rails:创建记录后(例如用户)更新另一个表(例如不是用户表)?
【发布时间】:2016-12-14 11:36:20
【问题描述】:

在我的应用程序中,我有用户和虚假帖子。我想要什么:对于每个用户,假帖子应该以随机顺序显示 - 但是与假帖子相关的(假)时间戳应该是按时间顺序排列的。为了更清楚:

User A sees: 
- Post 1 created at 15.12.2016 - 14:00     
- Post 2 created at 15.12.2016 - 13:00    
- Post 3 created at 14.12.2016 - 23:00

User B sees:
- Post 3 created at 15.12.2016 - 14:00 
- Post 1 created at 15.12.2016 - 13:00
- Post 2 created at 14.12.2016 - 23:00

我已经用这些列创建了一个新表:

fakepost_id | user_id | fake_timestamp

我的模型看起来像这样:

# fakepost.rb
class Fakepost < ApplicationRecord
  has_many :randomized
end

# user.rb
class User < ApplicationRecord
  has_many :randomized
end

# randomized.rb
class Randomized < ApplicationRecord
  belongs_to :user
  belongs_to :fakepost
end

现在我想做以下事情(我现在只有伪代码,因为我不知道如何实现它:(...)

  • 创建新用户时...
  • 获取所有虚假帖子并...
  • 为每个 fakepost 写入新表:fakepost_id、新创建用户的 user_id 和过去的随机时间。

我知道在我的 user.rb 模型中我可以定义一个 after_create 回调,但是我如何在我的用户模型中获取所有的 fakeposts(它们没有关联)以及我如何写入另一个表(不是用户表)?还是我应该创建一个 randomize.rb 模型?

【问题讨论】:

    标签: ruby-on-rails database callback


    【解决方案1】:
    def create
      @user = User.new(user_params)
    
      Fakepost.all.each do |fp|
        @user.randomized.new(fakepost: fp)
      end
    
      # will insert @user first then the associated randomized(s)
      if @user.save
        redirect_to "/somewhere"
      else
        render :new
      end
    end
    

    您可以在随机模型中设置随机时间戳。

    如果您使用的是 Devise,您可以通过 subclassing Devise::RegistrationsController 执行此操作并将块传递给 super:

    class MyRegistrations < Devise::RegistrationsController
      def create
        super do |resource|
          Fakepost.all.each do |fp|
            resource.randomized.new(fakepost: fp)
          end
        end
      end
    end
    

    【讨论】:

    • 我实际上确实为我的用户模型使用了设计,所以你的第二个答案很完美! (我对您的解决方案如此简单和干净感到惊讶,我尝试了不同的“after_save”、“after_create”等回调)。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多