2011-04-08 2 views
7

그래서 두 개의 모델이있는 앱이 있습니다. Foo has_one Bar, Bar belongs_to Foo.레일 : 하나가없는 "has_one"레코드 찾기

이제는 Foo를 만들려면 막대를 만들어야합니다.하지만 내 제작 앱에는 Foo가 없으므로 균열을 건너 뛴 것처럼 보입니다. 바, 500 오류가 발생합니다.

내가 검색 할 수 있습니다 : 잘 Bar.where(:foo=>nil)

지금, 여기에 문제입니다. 그러나 고아가 된 막대는 문제가되지 않으며 이것이 내가 필요한 것을 말하지 않습니다.

바가없는 경우 Foo를 찾아야합니다. 그러나 데이터베이스는 Bars 테이블에 관계를 저장합니다. 즉, BarsTable에는 foo_id가 있고, FoosTable에는 막대가 누락되었음을 알리는 내용이 없습니다.

Foo.find(#).bar을 사용할 때 하나의 가짜 레코드에 대해 nil을 얻지 만 많은 레코드가 있습니다.

그래서, 아무도 바가없는 Foo를 반환하는 쿼리를 생성하는 방법을 말해 줄 수 있습니까?

감사합니다.

답변

7

나는 루비 코드가 어떻게 될지 모르겠지만, 나는 SQL 같은 것을해야한다고 생각 :

+4

이것은 효과가 있습니다. - Rails에서는'Foo.where (id가 아닌 (SELECT foo_id FROM Bar) ")'감사합니다! – Andrew

+0

IMHO, 이것을하기위한 정확한 AR 방법은'SELECT \'foos \'. * FROM \'foos \'INNER JOIN \'bars \'의 SQL 질의 결과 인'Foo.joins (: bar) 'on \'bar \'. \'foo_id \'= \'foos \'. \'id \''. 'Foo.includes (: bar) .joins (: bar)'는 DB에 대한 몇 가지 후속 요청을 저장할 수 있습니다. –

2

WHERE ID NOT IN (바에서 foo_id를 선택) 또 다른 방법 푸 FROM

SELECT *를 (SQL을 사용하지 않고) 다음과 같이하면된다 :

Foo.all.select {| f | ! f.bar}

이렇게하면 관련 Bar 객체가없는 Foo 객체의 배열이 반환됩니다.

이 방법에서는 특정 테이블 정보에 의존하지 않습니다. 나중에 Foo -> Bar 연결에서 foreign_key 열이 변경되면이 메서드는 계속 작동합니다.

+0

좋은 팁, 감사합니다! – Andrew

+0

이것은 AR 개체를 가져 와서 인스턴스화하기 때문에 성능이 훨씬 떨어집니다. – kranzky

관련 문제