2017-11-02 2 views
3

를 생성 SQL :활동 기록은 명령</p> <pre><code>Fight.last.fight_logs.where(item_id: nil) </code></pre> <p>다음 빈 배열

Fight Load (0.3ms) SELECT "fights".* FROM "fights" ORDER BY "fights"."id" DESC LIMIT $1 [["LIMIT", 1]] 
FightLog Load (0.2ms) SELECT "fight_logs".* FROM "fight_logs" WHERE "fight_logs"."fight_id" = $1 AND "fight_logs"."item_id" IS NULL LIMIT $2 [["fight_id", 27], ["LIMIT", 11]] 

반환 :

#<ActiveRecord::AssociationRelation [#<FightLog id: 30, fight_id: 27, attack: 0, block: 0, item_id: nil, user_id: 1, damage: 11.0, created_at: "2017-11-02 16:20:55", updated_at: "2017-11-02 16:20:57">, #<FightLog id: 31, fight_id: 27, attack: 0, block: 0, item_id: nil, user_id: 20, damage: 3.0, created_at: "2017-11-02 16:20:57", updated_at: "2017-11-02 16:20:57">, #<FightLog id: 33, fight_id: 27, attack: 0, block: 0, item_id: nil, user_id: 1, damage: 1.0, created_at: "2017-11-02 16:21:40", updated_at: "2017-11-02 16:21:40">, #<FightLog id: 32, fight_id: 27, attack: 0, block: 0, item_id: nil, user_id: 20, damage: 7.0, created_at: "2017-11-02 16:21:33", updated_at: "2017-11-02 16:21:40">, #<FightLog id: 34, fight_id: 27, attack: 0, block: 0, item_id: nil, user_id: 1, damage: 12.0, created_at: "2017-11-02 16:21:47", updated_at: "2017-11-02 16:21:48">, #<FightLog id: 35, fight_id: 27, attack: 0, block: 0, item_id: nil, user_id: 20, damage: 14.0, created_at: "2017-11-02 16:21:48", updated_at: "2017-11-02 16:21:48">]> 

하지만

Fight.last.fight_logs.where.not(item_id: 1) 

Fight Load (1.0ms) SELECT "fights".* FROM "fights" ORDER BY "fights"."id" DESC LIMIT $1 [["LIMIT", 1]] 
FightLog Load (0.8ms) SELECT "fight_logs".* FROM "fight_logs" WHERE "fight_logs"."fight_id" = $1 AND ("fight_logs"."item_id" != $2) LIMIT $3 [["fight_id", 27], ["item_id", 1], ["LIMIT", 11]] 

반환 : 가능 얼마나

#<ActiveRecord::AssociationRelation []> 

는 SQL 생성? 내가 뭘 잘못하고있어?

당신은 당신이 당신의 데이터베이스에이 있기 때문에 쿼리에 NULL 값을 지정해야합니다

답변

3

가 : SQL 작동

Fight.last.fight_logs.where('item_id != ? OR item_id IS NULL', 1) 

이 단지 방법 :

select 1 != NULL; 
+-----------+ 
| 1 != NULL | 
+-----------+ 
|  NULL | 
+-----------+ 

당신은이 문제를 명확히하기 위해 this answer 볼 수 있습니다 . 또한 데이터베이스에서 기본 NULL 값을 사용하는 것을 피하는 것이 좋습니다. answer이 좋습니다. 케이스 default: 0, null: false을 사용하면됩니다.

+0

@MrYoshiji'당신은 해시 객체를 # 또는로 전달했습니다. 대신 ActiveRecord :: Relation 객체를 전달하십시오. – Src

+0

@MrYoshiji Using Rails 5 – Src

+1

@Src는'.or (Flight.last.flight_logs.where (item_id : nil))'을 사용합니다 (이 범위를 변수에 저장할 수 있습니다). – MrYoshiji