2016-04-08 10 views
0

Yeni sütunlar eklenirken, taşıma sırasında verileri bir tablodan diğerine taşımaya çalışıyorum. Kullanıcı modelimde, sütun modeline ve galeri modeline (verileri de dahil olmak üzere) taşımak istediğim phone_permission vardı. Kodum:SQL Geçiş sırasında bir tablodan diğerine Veri Kopyala

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 

Hata: SQLite3 :: SQLException: yakın "AS": sözdizimi hatası: g AS GÜNCELLEME galeriler, kullanıcıların u SET OLARAK g.phone = u.phone NEREDE u.id = g.user_id

Yardımlarınız için teşekkürler!

+1

https://www.sqlite.org/lang_update.html sql [ait – JimmyB

+0

Olası yinelenen: Başka bir tablodan tablo değerlerini güncellemek için nasıl aynı kullanıcı adıyla?] (http://stackoverflow.com/questions/3845718/sql-how-to-update-table-values-from-another-table-with-the-same-user-name) – JimmyB

+0

Teşekkürler @HannoBinder - Daha yakından bakacak – robinyapockets

cevap

1

Yukarıdaki kodunuz SQLite SQL için geçerli değil.

Ayrıca, neden ActiveRecord'u kullanmıyorsunuz? Böyle bir şey hile yapmak gerekir:

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

EDIT: the docs devletler olarak 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.

Bu bence Ham SQL yazmak için sadece daha güzel bir yoldur.

DÜZEN 2: Yorumlarda belirtildiği gibi @llya, model adınızı değiştirirseniz geçişiniz kesilir. Burada basit bir hile göç üstünde bu sınıf tanımını eklemektir:

class Gallery < ActiveRecord::Base; end 
+0

, göçlerdeki modelleri kullanmak kötü bir fikirdir. – Ilya

+0

Size% 95 oranında katılıyorum,% 5 bu 'update_all' ifadesidir :). Yukarıdaki düzenlemeye bakın. – born4new

+0

Gelecekte bu model adını düzenlerseniz, geçişiniz kabul edilemez olacaktır. – Ilya