2016-07-01 5 views
1

현재 액티브 레코드 연관이 작동하고 있지만 이와 같은 작업을보다 효율적으로 수행 할 수 있는지 궁금합니다. 기본적으로 Task라는 모델이 있습니다. 한 작업에는 한 명의 제작자가 있으며 많은 사람들에게 할당 할 수 있습니다. 사용자 모델은 User라는 Devise Model입니다. 이것은 현재의 설정이지만 사용자를 위해 모든 작업을 가져 오는 데 사용해야하는 쿼리를 작성했는지 또는 할당했는지에 관계없이 쿼리가 마음에 들지 않습니다. 여기 내 모델입니다. 현재의 설정은 페이지 매김과도 끔찍합니다. 어떤 제안?할당 된 활성 레코드 관계

class Task < ActiveRecord::Base 
    has_and_belongs_to_many :users 
    belongs_to :creator, foreign_key: 'creator_id', class_name: 'User' 
end 

class User < ActiveRecord::Base 
    has_and_belongs_to_many :assigned_tasks, class_name: 'Task' 
    has_many :created_tasks, foreign_key: 'creator_id', class_name: 'Task' 

    def tasks 
    (assigned_tasks.includes(project: [:client]) + created_tasks.includes(project: [:client])).uniq 
    end 
end 

그래서 basicslly 작업은 가지고있다 :

  • 한 창조자 (사용자)에 할당
  • 많은 사용자

솔루션

def tasks 
    Task.joins('LEFT JOIN tasks_users ON tasks_users.task_id = tasks.id').where('tasks_users.user_id = :user_id OR tasks.creator_id = :user_id', { user_id: id }).includes(project: [:client]) 
    end 
+0

사용자가 소유하고 사용자에게 할당 한 모든 작업을 가져 오는 데 사용되는 방법에 대해 정확히 무엇이 마음에 들지 않는지에 대해 좀 더 통찰력을 줄 수 있습니까? 어떤 특별한 문제가 있습니까? 너무 오래 걸립니까? 너무 많은 검색어를 만드시겠습니까? – Kyril

+0

@Kyril 네, 더 자세히 설명하지 못해 죄송합니다. 기본적으로 Kaminari에서이 두 페이지를 호출하기 때문에 까다롭게 나타납니다. (조인과 실제 작업 테이블)이 모든 작업을 수행하려면 지저분 해집니다. 'status : : open'은 태스크의'enum'입니다. –

+0

HABTM 조인을 제거하고 실제 모델을 사용하여 'Asssignment'또는 이와 유사한 'has_many : tasks, through : assignments'태스크에 사용자를 참여시킬 수 있습니다. – Kris

답변

0

이 작업을 수행하는 빠른 방법은 다음과 같습니다 우리는이 작업과 사용자 사이에 테이블을 조인 보내고 LEFT JOIN있어

class User 
    def associated_tasks 
    Task.joins(:user).joins("LEFT JOIN user_tasks ON user_tasks.task_id = tasks.id").where("users.id = :user_id OR user_tasks.user_id = :user_id", { user_id: id }).includes(project: [:client]) 
    end 
end 

주, 나는 user_tasks, 당신은 다른 사람을 대체 할 수 있어야한다고했다.

이렇게하는 다른 방법이 있습니다. 나는 시간을 가질 때 이것들을 포함하도록 대답을 업데이트 할 것이다.

+0

나는 당신의 대답을 맨 아래로 업데이트했고 연관 방법에 맞게 약간 수정했습니다. 생성 된 작업 만 반환되는 이유는 무엇입니까? –

+0

아니, 이미 has_many' 내부에서 작동하지 않을 것입니다. 관계가 이미 생성되었다고 가정하기 때문입니다. 'scope : assigned_tasks, -> (user) {여기의 메소드}'를 사용하십시오. – oreoluwa

0

대신이 방법으로 그것을 복잡하게, 나는 그냥 사용자

+0

'ActiveRecord'로 이것을 사용하고 싶지 않을 것입니다. 이렇게하면 모든 레코드를 가져와 메모리에서 선택을 시작합니다. 그것은'OP'에 명시된 것보다 더 나을 것입니다. – oreoluwa

+0

@ololuwa 이것은 내 실업이있는 곳이며, 효율적이고 필터링하기 쉬운 검색어를 찾지 못했습니다. –

+0

도움이 될만한 검색어를 모의하려고하지만, 괜찮 으면 Arel을 사용할 수 있습니다. – oreoluwa

0

has_many하여 작업을 찾을 수있는 작업 테이블

class Task < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

class User < ActiveRecord::Base 
    has_and_belongs_to_many :tasks 

    def user_created_tasks 
    tasks.select { |x| x.created_by == id } 
    end 
end 

또는 그런 일에 CREATED_BY이 (가) 작성한 열을 둘 것입니다 것은 어디 사용할 수있는 절에있는 수용 더 범위의 관계에 :

class User < ActiveRecord::Base 
    has_and_belongs_to_many :assigned_tasks, class_name: 'Task' 
    has_many :created_tasks, foreign_key: 'creator_id', class_name: 'Task' 
    has_many :tasks, ->(user) { joins(:users).where('users.id = ? OR tasks.creator_id = ?', user.id, user.id) } 
end 

.. 그리고 다음 @user.tasks는 지정된 사용자에 의해 할당 및 생성 된 모든 작업을 제공합니다.

+0

'has_and_belongs_to_many : assigned_tasks'에 의해 잘 사용되는 조인 테이블과 함께 작동합니까? 여러 사용자에게 작업을 할당 할 수 있기 때문에 user_id 열이 없습니다. –

+0

아, 죄송합니다. HABTM 관계를 잊어 버렸습니다. 내 대답 수정 – Kyril

+0

아래쪽에 코드로 내 질문을 업데이트했지만 약간 수정되었습니다. 왜 아무 것도 돌려주지 않는 이유는 무엇입니까? 원래 코드도 아닙니다. –

관련 문제