2016-12-14 13 views
0

私のアプリケーションでは、ユーザーと偽の投稿があります。私が望むもの:各ユーザに対して、偽の投稿はランダムな順序で表示されるべきですが、偽の投稿に関連付けられた(偽の)タイムスタンプは年代順であるべきです。それをより明確にするには:今、私は次のことをやりたいRails:レコード(ユーザーなど)を作成した後、別のテーブル(ユーザーテーブルではない)を更新しますか?

# 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_id | user_id | fake_timestamp 

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、およびランダムな時間で:新しいユーザーが作成され
  • ...
  • は、各fakepostための新しいテーブルに...
  • 書き込みをすべてfakepostsを取得し、過去。

私はuser.rbモデルでは、私はafter_createコールバックを定義することができることを知っているが、(ないどのように私は私のユーザモデル内のすべてのfakepostsを得るのですか(それらが関連付けられていない)とどのように私は別のテーブルに書き込みますかusersテーブル)?またはrandomize.rbモデルを作成する必要がありますか?

答えて

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 

ランダムタイムスタンプの設定は、ランダム化モデルで処理できます。

あなたはsubclassing Devise::RegistrationsControllerすることでこれを行うには、スーパーにブロックを渡してしまう工夫を使用している場合:

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

私は実際にあなたの第二の答えは完全に働いたので、私のUserモデルのための工夫を使用してください! (そして、私はあなたのソリューションがいかに簡単できれいであるかに驚いています。私はさまざまな "after_save"、 "after_create"などのコールバックを試しています)。ありがとうございました! – OhDaeSu

関連する問題