2010-06-04 6 views
17

ID 열이없는 테이블이 있습니다. ActiveRecord를 사용하여 삭제하려고하면 생성 된 SQL은 분명히 작동하지 않는 DELETE FROM table_name WHERE ID=NULL입니다. ActiveRecord를 사용하여 테이블에서 삭제할 수있는 방법이 있습니까? 아니면 적어도 SQL 삽입 쿼리에 영향을주지 않으므로 자리 표시자를 사용하여 원시 SQL 삭제 쿼리를 실행해야합니까?어떻게 루비 ActiveRecord에서 ID 열없이 레코드를 파괴 할 수 있습니까?

답변

24

ActiveRecord의 delete_all 메소드를 사용해 보셨습니까? 여기에 내 샌드 박스에서 발췌 한 것입니다 :

>> customer = Customer.new(:login => 'foo') 
=> #<Customer id: nil, status: 0, name: nil, login: "foo", password: nil, salt: nil, api_key: nil, address: nil, town: nil, state: nil, country: "USA", zipcode: nil, balance: #<BigDecimal:1032669b0,'0.0',9(18)>, discount: 0, last_four_cc: nil, auto_renew: false, contact_name: nil, contact_email: nil, domain: "anon.limelock.com", created_at: nil, updated_at: nil> 
>> customer.save 
=> true 
>> Customer.all.count 
=> 4 
>> Customer.delete_all(:login => 'foo') 
=> 1 
>> Customer.all.count 
=> 3 

생성 된 SQL은 DELETE FROM `customers` WHERE (`customers`.`login` = 'foo')

체크 아웃 documentation

+0

이것이 방법입니다. 나는 이것에 대답하려고했다. –

+0

모든 경우에 적용되는 것은 아닙니다. 모델 게임과 모델 AppVersion이 있습니다. 게임 has_many : app_versions. 'Game.first.app_versions.delete_all'은 'DELETE FROM'app_versions 'WHERE'app_versions '. "= NULL을 생성합니다. 이는 오류입니다. –

+0

Rails 4.2에서는 릴레이션에서'.delete_all' 메쏘드에 forelying_keys에 null을 설정하는'nullify'와 실제로 그 객체들을 제거하는': delete_all'을 전달할 수있는 옵션이 두 가지 밖에 없다고합니다. 기본값은': nullify'입니다. – mariowise

8
ActiveRecord::Base.connection.execute('DELETE FROM table_name WHERE ...') 

ActiveRecord가 올바르게 작동하려면 고유 한 ID 열이 있어야한다고 생각하지만 100 % 확실하지는 않습니다.

+0

가 AFAIK이 자리 작동하지 않습니다이다. – Johnny

+0

'sanitize_sql_array'는 자리 표시 자 문제를 해결합니다. – x1a4

관련 문제