ActiveRecordのdestroyで発行されるSQLが不完全な状態となる


質問の前にテーブルの構成を示します。

# 構成

## テーブル

  * users … ユーザ情報を保持するテーブル 
  * entries … はてなブックマークのエントリー情報を保持するテーブル 
  * laters … ユーザが”あとで読む”に設定したエントリー情報を保持するテーブル 

## リレーション

  * users … has_many :laters 
  * entries … has_many :laters 
  * laters … belongs_to :user、belongs_to :entry 

* * *

# 質問

ユーザに紐づくlatersテーブルのレコードを削除する実装がうまくいきません。  
削除の実装は簡略化すると、下記のようになります。

## 実装

[code]

    User.find(1).laters.where({:entry_id => 1}).first.destroy
    
[/code]

この実装で動かすと下記のようなSQLが発行されます。

## 発行されるSQL

[code]

    DELETE FROM laters WHERE laters.'' = NULL
    
[/code]

latersのレコードが取得できていないのかと思い確認しましたが、レコードは取得されていました。  
何が原因で不完全なSQLとなっているか分かりますでしょうか。

* * *

# ソースコード

Githubにソースコードを上げています。  
<https://github.com/hogesuke/tech-book>

## 該当箇所

<https://github.com/hogesuke/tech-book/blob/master/app.rb#L221>




解決しました。

まず、前提となるテーブルのアソシエーションが間違っていました。  
（修正前）  
users … has_many :laters  
entries … has_many :laters  
laters … belongs_to :user、belongs_to :entry

（修正後）  
users … has_many :entries, :through => laters  
entries … has_many :users, :through => laters  
laters … belongs_to :user、belongs_to :entry

latersを中間テーブルとし、userとentryを結びつけるのが正しいアソシエーションでした。  
そして、userとentryの紐付けの削除は、下記のようにすることで実現できました。

[code]

    user.entries.destroy(entry)
    
[/code]

お騒がせしました。ありがとうございました。




解決しました。

まず、前提となるテーブルのアソシエーションが間違っていました。  
（修正前）  
users … has_many :laters  
entries … has_many :laters  
laters … belongs_to :user、belongs_to :entry

（修正後）  
users … has_many :entries, :through => laters  
entries … has_many :users, :through => laters  
laters … belongs_to :user、belongs_to :entry

latersを中間テーブルとし、userとentryを結びつけるのが正しいアソシエーションでした。  
そして、userとentryの紐付けの削除は、下記のようにすることで実現できました。

[code]

    user.entries.destroy(entry)
    
[/code]

お騒がせしました。ありがとうございました。

