2017-08-01 14 views
0

フィールドにメールアドレスを入れると、匿名で投稿できるRoRアプリケーションがあります。Ruby on Rails:他のモデルからモデル値を反復するbefore_create/before_save

モデルはこのようになります。

ポストモデル。タイトル、本文、USER_EMAIL:文字列、USER_ID:整数

私のユーザモデルが工夫宝石から来た

post.rb 
    belongs_to :user # optional: true --> this is for rails 5 

ユーザモデル

user.rb 
    has_many :posts 

マイポストモデルでは、これらの列があります。

私のアプリでは、ログインしたりサインアップしたりせずにユーザーの投稿を許可しています。これらは投稿を作成できることを意味し、user_id列は空白になります(メールを入力する必要があるため)。

しかし、私が達成したいのは、自分のアプリにサインアップした場合、登録したユーザーに関連付けられたすべての投稿がuser_id列を対応するuser.idに変更する必要があるということです。だから私のuser.rbモデルでは、私はこのコードを追加しました。

# user.rb 
before_save :associate_post_to_user 

def associate_post_to_user 
    Post.all.each do |post| 
    if post.user_email == self.email 
     post.user_id = self.id 
    end 
    end 
end 

ただし、アカウントを作成するたびに、投稿のuser_idの値は変更されません。これをどのように達成するのですか?私はdevise gem btwを使用しています。前もって感謝します!あなたのコード内

答えて

2

2つの問題:

  1. があるなしpost.savepost.user_id = self.id

  2. Post.all使用、SQL意志後すべての投稿のレコードを照会すると、パフォーマンスの問題が発生します。

は、あなたがこのようにそれを変更することができかもしれませ:

def associate_post_to_user 
     Post.where(user_email: self.email).update_all(user_id: self.id) 
    end 
+0

ありがとうございます!これは本当に役に立ちます。私は、update_allというヘルパーがあることを知らなかった。ところで、あなたはどうやってこれらのヘルパーを知っていますか?これらすべてを教える特定の本はありますか? – Lorelyn

+0

頻繁にレールのAPIを読んでください、それはあなたにもっと役立ちます。参照はhttps://apidock.com/rails/v4.0.2/ActiveRecord/Relation/update_all – xiaocui

1

before_saveフックがあなたのUserモデルに定義されているので、明示的にあなたのPostインスタンスをsaveする必要があります。

# user.rb 
before_save :associate_post_to_user 

def associate_post_to_user 
    Post.all.each do |post| 
    if post.user_email == self.email 
     post.user_id = self.id 
     post.save 
    end 
    end 
end 
+0

ありがとうございます!私はモデルが現在まだ保存されていないので、post.saveを行うことは冗長になりますが(それがbefore_saveの理由です)。今私はそれがありがとうではない知っている! – Lorelyn

関連する問題