복붙노트

[RUBY-ON-RAILS] 두 액티브 :: 관계 개체를 결합

RUBY-ON-RAILS

두 액티브 :: 관계 개체를 결합

나는 다음과 같은 두 객체가 있다고 가정 :

first_name_relation = User.where(:first_name => 'Tobias') # ActiveRecord::Relation
last_name_relation  = User.where(:last_name  => 'Fünke') # ActiveRecord::Relation

이 두 조건을 포함하는 생산 한 액티브 :: 관계 객체에 두 관계를 결합 할 수 있습니까?

참고 : 나는이 동작을 얻을 수있는 알의를 체인 수 있다는 것을 알고 있어요는, 내가 정말 관심있어하는 것은 내가 두 개의 액티브 :: 관계 객체를 가지고있는 경우입니다.

해결법

  1. ==============================

    1.당신이 사용 병합을 사용하여 AND (교차) 결합하려는 경우 :

    당신이 사용 병합을 사용하여 AND (교차) 결합하려는 경우 :

    first_name_relation.merge(last_name_relation)
    

    당신이 †, 사용 또는 사용하거나 (조합) 결합하려는 경우 :

    first_name_relation.or(last_name_relation)
    

    † 만 5 + 액티브의; 4.2의 경우 또는 백 포트를 설치합니다.

  2. ==============================

    2.관계 객체 배열로 변환 할 수 있습니다. 이을 Negate 나중에 그들에 어떤 액티브 방법을 사용 할 수있는,하지만 난에 필요하지 않았다. 저는 이것을 했어요:

    관계 객체 배열로 변환 할 수 있습니다. 이을 Negate 나중에 그들에 어떤 액티브 방법을 사용 할 수있는,하지만 난에 필요하지 않았다. 저는 이것을 했어요:

    name_relation = first_name_relation + last_name_relation
    

    루비 1.9, 3.2 레일

  3. ==============================

    3.나처럼 작동하지 않습니다 실제로 병합합니다. 그것은 단순히 교차로의 (AND)

    나처럼 작동하지 않습니다 실제로 병합합니다. 그것은 단순히 교차로의 (AND)

    나는 하나에 액티브 :: 관계 객체에 결합이 문제 고투하고 나를 위해 어떤 작업 해결책을 발견하지 않았다.

    대신이 두 세트에서 노동 조합을 만들 권리 방법을 찾고, 나는 세트의 대수에 초점을 맞추었다. 당신은 드 모건의 법칙을 사용하여 다른 방법으로 그것을 할 수 있습니다

    액티브 병합 방법 (AND)를 제공하고 또한 당신은 방법 또는 (NOT) none_of하지 사용할 수 있습니다.

    search.where.none_of(search.where.not(id: ids_to_exclude).merge(search.where.not("title ILIKE ?", "%#{query}%")))
    

    현재 위치 (A U B) '= A'^ B '를 가지고

    최신 정보: 이 솔루션은 위의 더 복잡한 경우에 좋습니다. 같은 사건에 떨어지게 충분히 될 것입니다에서 :

    User.where('first_name LIKE ? OR last_name LIKE ?', 'Tobias', 'Fünke')
    
  4. ==============================

    4.나는 레일 'Arel 내장 사용하여도 많은 이상한 상황에서, 이러한 목표를 달성 할 수있었습니다.

    나는 레일 'Arel 내장 사용하여도 많은 이상한 상황에서, 이러한 목표를 달성 할 수있었습니다.

    User.where(
      User.arel_table[:first_name].eq('Tobias').or(
        User.arel_table[:last_name].eq('Fünke')
      )
    )
    

    이 Arel의 또는를 사용하여 모두 액티브 관계를 병합합니다.

    여기에 제안 된대로 병합, 나를 위해 작동하지 않았다. 이 결과에서 관련 개체의 2 세트를 떨어졌다.

  5. ==============================

    5.보석이라고 active_record_union가있다 그건 당신이 찾고있는 무슨 수 있습니다.

    보석이라고 active_record_union가있다 그건 당신이 찾고있는 무슨 수 있습니다.

    그것의 예를 들어 용도는 다음과 같다 :

    current_user.posts.union(Post.published)
    current_user.posts.union(Post.published).where(id: [6, 7])
    current_user.posts.union("published_at < ?", Time.now)
    user_1.posts.union(user_2.posts).union(Post.published)
    user_1.posts.union_all(user_2.posts)
    
  6. ==============================

    6.이렇게하면, 각 레코드에 대한 식별자를 얻을 함께 배열에 가입 한 후 마지막으로 그 가입 ID에 대한 쿼리를 수행 할 뽑은 사용하는 경우 내가 그것을 "처리"한 방법입니다 :

    이렇게하면, 각 레코드에 대한 식별자를 얻을 함께 배열에 가입 한 후 마지막으로 그 가입 ID에 대한 쿼리를 수행 할 뽑은 사용하는 경우 내가 그것을 "처리"한 방법입니다 :

      transaction_ids = @club.type_a_trans.pluck(:id) + @club.type_b_transactions.pluck(:id) + @club.type_c_transactions.pluck(:id)
      @transactions = Transaction.where(id: transaction_ids).limit(100)
    
  7. ==============================

    7.당신이 액티브 관계의 배열을 가지고 그들에게 모든 병합하려는 경우, 당신은 할 수있다

    당신이 액티브 관계의 배열을 가지고 그들에게 모든 병합하려는 경우, 당신은 할 수있다

    array.inject(:merge)
    
  8. ==============================

    8.브 루트는 강제 :

    브 루트는 강제 :

    first_name_relation = User.where(:first_name => 'Tobias') # ActiveRecord::Relation
    last_name_relation  = User.where(:last_name  => 'Fünke') # ActiveRecord::Relation
    
    all_name_relations = User.none
    first_name_relation.each do |ar|
      all_name_relations.new(ar)
    end
    last_name_relation.each do |ar|
      all_name_relations.new(ar)
    end
    
  9. ==============================

    9.나는이 문제에 시대의 소수를 발견했습니다과 일반적으로 인정 된 반응은 매우 나를 위해 일하지 않았다.

    나는이 문제에 시대의 소수를 발견했습니다과 일반적으로 인정 된 반응은 매우 나를 위해 일하지 않았다.

    허용 대답에 제안 된 솔루션은 잘 작동하는 것처럼 보였다 :

    first_name_relation.or(last_name_relation)
    

    그러나 나는 일이 얻을 수 없었 항상 '나'에 대한 '정의되지 않은 메서드'오류가 발생합니다.

    내 솔루션 :

    combined_relation = first_name_relation + (last_name_relation - first_name_relation)
    

    이것은 나에게 본질적으로 여전히 원래 쿼리와의 관계 객체 사이의 UNION의 결과하는 올바른 액티브 오브젝트를 제공합니다.

    나는 개체의 DISTINCT 수집을 얻을 수있는 빼기를 추가 할 필요가 있지만 이것은 @thatmiddleway에서 제공하는 대답과 비슷합니다. 이 배열로 결합 된 컬렉션을 변환 않습니다,하지만 난 여전히 내 문제를 해결 내보기에 반복자에 '각'의 개별 인스턴스에에서 모델 메소드를 호출 할 수있다.

    이것은 처음에 StackOverflow 대답 (말하다!), 나는 당신의 의견을 환영합니다 그래서!

  10. from https://stackoverflow.com/questions/9540801/combine-two-activerecordrelation-objects by cc-by-sa and MIT license