2016-09-07 15 views
1

私はほぼ2年前に作ったウェブサイトを更新中です。それは私の最初の本当のウェブサイトでした。私はいくつかの間違いを犯しました。Ruby on Rails:新しいデータベースエントリに基づいてリンクを作成する

明らかに私の最大のものは、ビューからのデータベース呼び出しです。

私はかなり気確かこれを行うには良い方法があるよ:

使用事例:

  1. 誰かが対象表を移入、新しい主題のためのフォームに記入"登録済み"とマークされています。Subject.enrolled = 1
  2. これに基づいて、5つのテーブル(ベースラインなど)にレコードを作成する必要があります。
  3. ダウンヒルここから、ここに私の方法がある

    • レコードがそうでない場合は、ディスプレイ(、レコードを作成し、それが存在しない場合は、被写体からのsubject_id(サブ)

      <$ if Baseline.where(subject_id: sub.subject_id).first != nil $> 
      
    • に基づいて存在するかどうかを確認しますリンク)

      <%= Baseline.create(subject_id: sub.subject_id) %> 
      
  4. これはすべてのビューで行われ、Cプロセスの各レコードへのリンクを含むフロントエンドテーブルを生成します。 は、だから私は方向を探しています:だから私は

が質問... forループのロジックに基づいてレコードを作成しています。私はこれを行う方法を推測したくありません - 私はモデル/コントローラがこれを行うべきであると確信しています - それを正しく行う方法を学びたいと思います。テーブルの値に基づいてレコードを自動的に作成するにはどうすればよいですか?

ありがとうございます。

+0

Formオブジェクトが使用できるものかどうかは不思議です。http://stratus3d.com/blog/2015/04/04/extensible-rails-4-form-object-design/ –

答えて

1

あなたのドメインとコードの様子はよく分かりませんが、この質問に答えるには、「テーブルの値に基づいて自動的にレコードを作成するにはどうすればよいですか?」というように、ActiveRecordコールバック:

class Subject < ActiveRecord::Base 
    after_commit :create_baseline_if_enrolled, on: [:create, :update] 

    private 

    def create_baseline_if_enrolled 
    return unless enrolled? 

    # enrolled? == true, you may create these models here 
    end 
end 

は、あなたの質問に答えるために: それは:)依存これはただ一つの可能​​な解決策です。もう1つは、そのようなカスタムロジックをSubjectsControllerに配置し、#create、#updateメソッドから直接呼び出すことです。両方のアプローチに長所と短所があります。たとえば、コールバックを悪用すると(どこでも)、コードの読み込みが難しくなり、デバッグが難しくなります。一方、コントローラにこのようなロジックを組み込むことは、他の場所で(たとえより明示的に)編集対象となる場合に、それを呼び出すことを覚えなければならないという負担をかけることになります。どのような方法を選んでも、クラスをあまりにも太くしないように注意してください。たとえば、サービスオブジェクトパターンを使用して、手に入らないようになったらすぐにそのようなカスタムロジックを分離してください。 :)テストを忘れないでください。テストが間違っていると、テストによってリファクタリングが簡単になります。

+0

これは私のように見えますやっている...after_saveはいつ呼び出されますか?件名は一定期間空白の値として登録され、その後いつでも1に変更されます。私はafter_update関数を見つけました。それはおそらく私が使うべきものでしょうか? –

+0

実際、after_commitコールバックでは、あなたのユースケースに適していると思う:http://apidock.com/rails/ActiveRecord/Transactions/ClassMethods/after_commit私は両方が実行されることを確認する方法でコードを更新しました作成と更新について。 –

+0

私は参照してください。私はあなたの答えを正しいものとしてマークしています、私はそれが正しい道に私を持っていると思います。しかしもう1つの質問ですが、これはモデルやコントローラーに入るべきでしょうか?私はこのモデルがこのようなデータベースのものであると思ったが、createと:updateはコントローラ機能である。お手伝いありがとう! –

関連する問題