Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 通过2个不同的关联检索所有项目_Ruby On Rails_Activerecord_Model - Fatal编程技术网

Ruby on rails 通过2个不同的关联检索所有项目

Ruby on rails 通过2个不同的关联检索所有项目,ruby-on-rails,activerecord,model,Ruby On Rails,Activerecord,Model,比方说 用户有许多项目(由用户创建的项目) 用户有许多成员资格 也 用户通过成员身份(其他用户创建的项目)加入了许多_项目 加入“projects”和“joined_projects”以获得用户有权访问的所有项目的最佳方式是什么 另一个选项是为所有项目创建成员资格,即使用户拥有该项目,但这会在数据库上生成重复数据。ActiveRelation中的join方法始终使用内部联接,因此从SQL角度看,无法“正确”执行此操作。但是,您始终可以设置计数器\u缓存,并按如下方式进行查询: class

比方说

  • 用户有许多项目(由用户创建的项目)
  • 用户有许多成员资格

  • 用户通过成员身份(其他用户创建的项目)加入了许多_项目
加入“projects”和“joined_projects”以获得用户有权访问的所有项目的最佳方式是什么


另一个选项是为所有项目创建成员资格,即使用户拥有该项目,但这会在数据库上生成重复数据。

ActiveRelation中的
join
方法始终使用内部联接,因此从SQL角度看,无法“正确”执行此操作。但是,您始终可以设置
计数器\u缓存
,并按如下方式进行查询:

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
class用户true
已加入\u多个项目,:至=>:成员身份,:计数器\u缓存=>true

类ActiveRelation
中的
join
方法始终使用内部联接,因此从SQL的角度来看,无法“正确”地执行此操作。但是,您始终可以设置
计数器\u缓存
,并按如下方式进行查询:

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
class用户true
已加入\u多个项目,:至=>:成员身份,:计数器\u缓存=>true
班