2016-04-08 5 views
0

移行中に新しい列を追加する際に、あるテーブルから別のテーブルにデータを移動しようとしています。私のユーザーモデルには列電話機とphone_permissionがあり、ギャラリーモデル(そのデータを含む)に移動したいと思います。私のコード:SQLコピー移行中にテーブル間でデータが交換される

def self.up 
    add_column :galleries, :phone, :string 
    add_column :galleries, :phone_permission, :integer, default: 1 

    execute "UPDATE galleries AS g, users AS u SET g.phone = u.phone WHERE u.id = g.user_id" 
    execute "UPDATE galleries AS g, users AS u SET g.phone_permission = u.phone_permission WHERE u.id = g.user_id" 

    remove_column :users, :phone 
    remove_column :users, :phone_permission 
end 

エラー:SQLite3の::のSQLException:近くに "AS":構文エラー:G AS UPDATEギャラリー、ユーザuはSET AS g.phone = u.phone WHERE u.id = g.user_id

ご協力いただきありがとうございます。

+1

https://www.sqlite.org/lang_update.html – JimmyB

+0

可能な重複:別のテーブルからテーブル値を更新する方法同じユーザー名で?](http://stackoverflow.com/questions/3845718/sql-how-to-update-table-values-from-another-table-with-the-same-user-name) – JimmyB

+0

ありがとう@ HannoBinder - 詳細を見る – robinyapockets

答えて

1

上記のコードはSQLiteでは有効ではありません。

また、ActiveRecordを使用してみませんか?

Gallery.joins(:user).update_all('galleries.phone = users.phone') 
Gallery.joins(:user).update_all('galleries.phone_permission = users.phone_permission') 

EDIT:update_all

This method constructs a single SQL UPDATE statement and sends it straight to the database. It does not instantiate the involved models and it does not trigger Active Record callbacks or validations.

ためthe docs状態としてはこれが私の意見では生のSQLを記述するだけできれいな方法でこのようなものは、トリックを行う必要があります。

編集2:@llyaがコメントに指摘したように、モデル名を変更すると、移行が壊れてしまいます。ここでの簡単なトリックは、マイグレーションの上に、このクラスの定義を追加することです:[SQLの

class Gallery < ActiveRecord::Base; end 
+0

マイグレーションでモデルを使用するのは悪い考えです。 – Ilya

+0

95%の時間に私はあなたに同意します、5%はこの 'update_all'ステートメントです:)。上記の私の編集を参照してください。 – born4new

+0

将来このモデル名を編集すると、移行は実行不能になります。 – Ilya

関連する問題