[RUBY-ON-RAILS] 어떻게 액티브 / 레일과 NOT IN 쿼리를 표현하는?
RUBY-ON-RAILS어떻게 액티브 / 레일과 NOT IN 쿼리를 표현하는?
당신이 레일을 트룽 Lê` 및 VinniVidiVicci에 의해 답변에서 4보기를 사용하는 경우 사람들이 와서의이 많이 보이기 때문에 그냥이를 업데이트합니다.
Topic.where.not(forum_id:@forums.map(&:id))
Topic.where(published:true).where.not(forum_id:@forums.map(&:id))
나는 내가 그 일을해야합니다 추측 다음 경우, find_by_sql 포함하지 않는 쉬운 솔루션이 바라고 있어요.
나는이 참조하는이 문서를 발견 :
Topic.find(:all, :conditions => { :forum_id => @forums.map(&:id) })
이는 동일하다
SELECT * FROM topics WHERE forum_id IN (<@forum ids>)
NOT 같은 그,에 할 수있는 방법이 있는지 궁금 :
SELECT * FROM topics WHERE forum_id NOT IN (<@forum ids>)
해결법
-
==============================
1.4+ 레일 :
4+ 레일 :
Article.where.not(title: ['Rails 3', 'Rails 5'])
3 레일 :
Topic.where('id NOT IN (?)', Array.wrap(actions))
여기서 활동은 배열과 같다 : 1,2,3,4,5]
-
==============================
2.참고로,에서 레일 4, 당신은하지 구문을 사용할 수 있습니다 :
참고로,에서 레일 4, 당신은하지 구문을 사용할 수 있습니다 :
Article.where.not(title: ['Rails 3', 'Rails 5'])
-
==============================
3.당신은 뭔가를 시도 할 수 있습니다 :
당신은 뭔가를 시도 할 수 있습니다 :
Topic.find(:all, :conditions => ['forum_id not in (?)', @forums.map(&:id)])
( '') .join을 (ID &) 당신은 @ forums.map을 할 필요가 있습니다. 레일은 열거를 CSV 목록에 인수 인 것입니다 경우 경우 기억이 없습니다.
또한이 작업을 수행 할 수 있습니다 :
# in topic.rb named_scope :not_in_forums, lambda { |forums| { :conditions => ['forum_id not in (?)', forums.select(&:id).join(',')] } # in your controller Topic.not_in_forums(@forums)
-
==============================
4.Arel 사용 :
Arel 사용 :
topics=Topic.arel_table Topic.where(topics[:forum_id].not_in(@forum_ids))
또는, 선호하는 경우 :
topics=Topic.arel_table Topic.where(topics[:forum_id].in(@forum_ids).not)
그리고 이후로는 4에 레일 :
topics=Topic.arel_table Topic.where.not(topics[:forum_id].in(@forum_ids))
제발 통지 결국 당신이 그렇게 다음 항목을 얻기 전에 이런 일을해야 할 경우 forum_ids에서, IDS 목록, 오히려 하위 쿼리가 될 싶지 않아 :
@forum_ids = Forum.where(/*whatever conditions are desirable*/).select(:id)
이런 방식으로 단일 쿼리에서 모든 것을 얻을 : 뭔가를 같이 :
select * from topic where forum_id in (select id from forum where /*whatever conditions are desirable*/)
또한 결국 원하지 않는 것을 통지는이 작업을 수행하는, 오히려 가입 - 더 효율적으로 될 일을.
-
==============================
5.당신이 다음을 수행 할 수 있습니다 레일 4, @Trung Lê 대답에 확장하려면 :
당신이 다음을 수행 할 수 있습니다 레일 4, @Trung Lê 대답에 확장하려면 :
Topic.where.not(forum_id:@forums.map(&:id))
그리고 당신은 한 단계 더 걸릴 수 있습니다. 당신은 당신이 원하지 않는 식별자 밖으로 만 발표 주제 및 다음 필터에 대한 첫 번째 필터해야하는 경우, 당신이 할 수 있습니다 :
Topic.where(published:true).where.not(forum_id:@forums.map(&:id))
4 개 차종이 너무 쉽게 레일!
-
==============================
6.@forums이 비어있는 경우 허용 솔루션은 실패합니다. 이 내가해야 할 일을했을 해결하려면
@forums이 비어있는 경우 허용 솔루션은 실패합니다. 이 내가해야 할 일을했을 해결하려면
Topic.find(:all, :conditions => ['forum_id not in (?)', (@forums.empty? ? '' : @forums.map(&:id))])
또는 레일을 3+ 사용하는 경우 :
Topic.where( 'forum_id not in (?)', (@forums.empty? ? '' : @forums.map(&:id)) ).all
-
==============================
7.위의 답변의 대부분은 충분하지만 더 같은 조건 복잡한 조합을 많이하고 있다면 Squeel에서 확인해야합니다. 당신은 같은 일을 할 수있을 것입니다 :
위의 답변의 대부분은 충분하지만 더 같은 조건 복잡한 조합을 많이하고 있다면 Squeel에서 확인해야합니다. 당신은 같은 일을 할 수있을 것입니다 :
Topic.where{{forum_id.not_in => @forums.map(&:id)}} Topic.where{forum_id.not_in @forums.map(&:id)} Topic.where{forum_id << @forums.map(&:id)}
-
==============================
8.당신은 어니 밀러에 의해 meta_where 플러그인 좀보고 할 수 있습니다. 귀하의 SQL 문 :
당신은 어니 밀러에 의해 meta_where 플러그인 좀보고 할 수 있습니다. 귀하의 SQL 문 :
SELECT * FROM topics WHERE forum_id NOT IN (<@forum ids>)
... 다음과 같이 표현 될 수있다 :
Topic.where(:forum_id.nin => @forum_ids)
Railscasts의 라이언 베이츠 MetaWhere을 설명하는 멋진 스크린 캐스트를 만들었습니다.
확실하지 이것이 당신이 찾고있는하지만 내 눈에 확실히 포함 된 SQL 쿼리보다 더 나은 모습입니다 경우.
-
==============================
9.원래 포스트는 특히 숫자 ID를 사용하여 언급,하지만 난 문자열 배열을 가진 NOT IN을 수행하기위한 구문을 찾고 여기에왔다.
원래 포스트는 특히 숫자 ID를 사용하여 언급,하지만 난 문자열 배열을 가진 NOT IN을 수행하기위한 구문을 찾고 여기에왔다.
액티브 너무 당신을 위해 잘 그것을 처리합니다 :
Thing.where(['state NOT IN (?)', %w{state1 state2}])
-
==============================
10.이 포럼 ID는 실용적인 방법에서 일을 할 수 있습니까? 예를 들면 당신은 어떻게 든이 포럼을 찾을 수 있습니다 - 그건 당신이 뭔가를해야 할 경우라면
이 포럼 ID는 실용적인 방법에서 일을 할 수 있습니까? 예를 들면 당신은 어떻게 든이 포럼을 찾을 수 있습니다 - 그건 당신이 뭔가를해야 할 경우라면
Topic.all(:joins => "left join forums on (forums.id = topics.forum_id and some_condition)", :conditions => "forums.id is null")
는 SQL하지에서하는 것보다 더 효율적이 될 것이다
-
==============================
11.이 방법은 가독성을 위해 최적화 있지만, 데이터베이스 쿼리의 측면에서 효율적으로 아니다 :
이 방법은 가독성을 위해 최적화 있지만, 데이터베이스 쿼리의 측면에서 효율적으로 아니다 :
# Retrieve all topics, then use array subtraction to # find the ones not in our list Topic.all - @forums.map(&:id)
-
==============================
12.당신은 당신의 환경에서 SQL을 사용할 수 있습니다 :
당신은 당신의 환경에서 SQL을 사용할 수 있습니다 :
Topic.find(:all, :conditions => [ "forum_id NOT IN (?)", @forums.map(&:id)])
-
==============================
13.jonnii의 오프 편승 :
jonnii의 오프 편승 :
Topic.find(:all, :conditions => ['forum_id not in (?)', @forums.pluck(:id)])
요소를 통해 뽑은보다는 매핑을 사용하여
railsconf을 통해 당신은 레일이 할 수 몰랐 2012 10 가지 발견
-
==============================
14.그것은 "NULL"를 반환하고 쿼리를 중단하지 않도록 당신은 어디에서 블록의 배열에 빈 배열 추가 "<< 0"을 쿼리합니다.
그것은 "NULL"를 반환하고 쿼리를 중단하지 않도록 당신은 어디에서 블록의 배열에 빈 배열 추가 "<< 0"을 쿼리합니다.
Topic.where('id not in (?)',actions << 0)
작업은 비어 있거나 빈 배열이 될 수 있다면.
-
==============================
15.여기 squeel를 사용하여 레일 4 서브 쿼리를 사용하여 검색어 "NOT IN"더 복잡하다. 물론 아주 느린에 해당하는 SQL에 비해하지만, 이봐, 그것을 작동합니다.
여기 squeel를 사용하여 레일 4 서브 쿼리를 사용하여 검색어 "NOT IN"더 복잡하다. 물론 아주 느린에 해당하는 SQL에 비해하지만, 이봐, 그것을 작동합니다.
scope :translations_not_in_english, ->(calmapp_version_id, language_iso_code){ join_to_cavs_tls_arr(calmapp_version_id). joins_to_tl_arr. where{ tl1.iso_code == 'en' }. where{ cavtl1.calmapp_version_id == my{calmapp_version_id}}. where{ dot_key_code << (Translation. join_to_cavs_tls_arr(calmapp_version_id). joins_to_tl_arr. where{ tl1.iso_code == my{language_iso_code} }. select{ "dot_key_code" }.all)} }
범위의 제 2 방법은 다른 별명 선언 범위 cavtl1 및 TL1이다. << squeel 연산자에 아니다.
이 사람을 도움이되기를 바랍니다.
from https://stackoverflow.com/questions/4307411/how-to-express-a-not-in-query-with-activerecord-rails by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 어떻게 레일에 to_json 오버라이드 (override)? (0) | 2020.02.04 |
---|---|
[RUBY-ON-RAILS] 3 레일 - PG 보석을 설치할 수 없습니다 (0) | 2020.02.04 |
[RUBY-ON-RAILS] 열망로드 다형성 (0) | 2020.02.04 |
[RUBY-ON-RAILS] 어떻게 루비 온 레일즈의 콘솔에서 컨트롤러 / 뷰 메소드를 호출하는 (0) | 2020.02.04 |
[RUBY-ON-RAILS] 사용자가 페이지와 쇼의 콘텐츠를 좋아하는 경우 페이스 북은 어떻게 확인합니까? (0) | 2020.02.04 |