Получение всех предметов через 2 разных ассоциации - PullRequest
1 голос
/ 18 ноября 2011

Допустим,

  • У пользователя много проектов (проектов, созданных пользователем)
  • У пользователя много членств

Также

  • У пользователя есть много присоединившихся проектов через членство (проекты, созданные другими пользователями)

Каков наилучший способ объединить «проекты» и «присоединенные_проекты», чтобы получить все проекты, к которым пользователь имеет доступ, мы надеемся, без использования sql.

Другим вариантом будет создание членства для всех проектов, даже если пользователь владеет проектом, но при этом в базе данных будут дублироваться данные.

1 Ответ

1 голос
/ 18 ноября 2011

Метод join в ActiveRelation всегда использует внутренние объединения, поэтому нет способа сделать это "правильно" с точки зрения SQL.Тем не менее, вы всегда можете настроить counter_cache и запросить его следующим образом:

class User < ActiveRecord::Base
  has_many :projects, :counter_cache => true
  has_many :joined_projects, :through => :memberships, :counter_cache => true

  class << self
    def has_projects
      where('projects_count > 0 OR joined_projects_count > 0')
    end
  end

  def all_projects
    projects + joined_projects
  end
end

Это может поразить нерв нормализации, но должно выполнить работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...