0

私はレールにかなり慣れていないので、これはばかげた質問かもしれませんが、多くの関係を持つオブジェクトを保存するために私が取っているアプローチが正しいかどうか疑問に思っています。

例:トピック、投稿、ユーザーを含む基本的なフォーラムアプリを考えてみましょう。トピックには、1人のユーザー、1つのフォーラム、および多くの投稿があります。ユーザーがフォームを介してタイトルとメッセージを送信する場合、これはすべてのテーブルにデータを保存するための最も効率的な方法ですか、それとももっと簡単な方法がありますか?

# init new topic object with forum & user relationships
@topic = Topic.new(
  :title    => params[:topic][:title], 
  :forum_id => params[:topic][:forum_id], 
  :user_id  => current_user.id
)

if @topic.save
  # init new post object with topic & user relationships
  @post = Post.new(
    :content  => params[:post][:content],
    :topic_id => @topic.id,
    :user_id  => current_user.id
  )

  if @post.save
    # update user's post count and last post info
    @user = User.find(current_user.id)
    @user.update_attributes(
      :post_count   => @user.post_count + 1,
      :last_post_at => Time.now,
      :last_post_id => @post.id
    )

    # update the forum stats and last post info
    @forum = Forum.find(@topic.forum_id)
    @forum.update_attributes (
      :topic_count  => @forum.topic_count + 1
      :last_post_id => @forum.recent_post.nil? ? 0 : @forum.recent_post.id
    )

    # redirect user back to the topic
    redirect_to topic_path(@topic.id)
end

より良い慣習はありますか、それともそれはほとんどそれですか?

4

1 に答える 1

1

いいえ、これは Rails でコードを書く適切な方法ではありません。レールに従って、コントローラーはモデルと比較して薄い必要があるため、ビジネスロジックはコントローラーではなくモデルに適用されます。

次のレビューコードを確認してください

@user = User.find(current_user.id)
@topic = @user.build_topic(params[:topic])
@post = @topic.posts.build(:content  => params[:post][:content], :user_id  => @user.id)
if @topic.save #Don't need to save posts explicitly if any error (i.e validation fails) is occur neither post nor topic 'll get save
  # redirect user back to the topic
  redirect_to topic_path(@topic.id)
end

after_createPost モデル (post.rb) でコールバックを使用してユーザーの投稿数を更新after_createし、トピック モデル (topic.rb) で AND コールバックを使用してフォーラムのトピック数を更新します。

于 2012-09-12T06:15:13.670 に答える