2016-06-17 1 views
0

私のアプリケーションでは、accountには、ユーザに表示する必要があるさまざまな一意のメッセージ(message_templates)があります。たとえば、新しい投稿が作成されたときの1つのアカウントでは、「投稿を作成してくれてありがとう!」と表示されることがあります。別のアカウントで「投稿が正常に作成されました!」と言いたい場合があります。Rails:アプリケーション依存のデータを維持する

特定の時刻にのみトリガーされるこれらのインアプリのセット番号があります(message_templates)。したがって、それぞれのアカウントは同じ数値で、値が異なります。

account = Account.create! 
MessageTemplate.create(account: account, slug: "post_created_thank_you", body: "Thank you for creating the post!") 
... 
# Can change the body column but nothing else. 

def PostsController < ApplicationController 
    def create 
    # create the post... 
    @thank_you_message = current_account.message_templates.find_by(
     slug: "post_created_thank_you" 
    ) 
    end 
end 

私はアプリケーションに機能を追加しているように、しかし、私は時々、私は別のmessage_templateを追加したいと私は、このテンプレートは、現在のすべてのアカウントのために作成されていることを確認する必要があることがわかります。

accountには様々なmessage_templatesがあることを確実にするためにRailsの移行を使用することを考えていましたが、移行は実際にはDBスキーマの変更であり、アプリケーションデータの変更ではありません。

私はrake db:seedも見ましたが、これは実際に更新を維持するためではなく、最初にDBをシードするためのものです。

1つの解決策は、新しいテンプレート付きメッセージを追加するたびに手動で実行するレーキタスクを作成することです。ちょっと不器用だと思う。

私が本当に好きなのは、データ用に構築された移行です。これは一般的な問題のようですが、これを実装する標準的な方法はありますか?さもなければ、私はおそらくデータの移行を実装する宝石を書くことになります。

答えて

0

あなたは、移行に使用すると、シードファイルなどで行うだろうと同じようにデータを作成することができます。

def up 
    Account.each do |account| 
    MessageTemplate.create(account: account, slug: "post_created_thank_you", body: "Thank you for creating the post!") 
    end 
end 
def down 
    MessageTemplate.where(slug: "post_created_thank_you").delete_all 
end 

か良いアイデアは、それがより速く走るので、SQLのINSERT INTO上記を有効にすることです...

+0

私はデータを移行自体に入れることができると知っていますが、私はそれをしないことを推奨している人が多くいます。移行はビジネスロジック(データ)を持ち、コアアプリの機能私はあなたがお勧めしたものをまさにやり遂げることをおもしろいですが、最初によりクリーンなアプローチがあるかどうかを見たいと思っていました。 –

+0

あなたが何をしていても、あなたはまだデータを持っています...そして、それをあなたのprod dbに移すためにはまだ移行の中で実行する必要があります。それ以外の解決策は、その事実の難読化です。ケーキをスライスする他の方法もありますが、それらはすべて「私はマイグレーションを実行し、dbにデータを入れるものを実行します」 –

関連する問題