Rails查找除已关联的第二级之外的所有记录

时间:2018-07-31 21:27:08

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我的Rails应用程序中有以下模型

模型community

class Community < ActiveRecord::Base
  has_many :community_program
end

模型community_program

class CommunityProgram < ActiveRecord::Base
  belongs_to :program_name
end

模型program_name

class ProgramName < ActiveRecord::Base
  has_many :community_programs
end

我正在尝试找到一种方法来提取所有不属于program_names的{​​{1}},而这些community_program已经分配给community

我已经能够拉出所有program_names,然后删除已经与program_names相关联的community,但这非常昂贵。我可以直接拉出第二级独立记录吗?

编辑:该问题与链接的问题有所不同,因为在这种情况下,program_name可能与另一个社区的社区计划有关联,但是如果它不包含,我们仍然希望包含该名称。与当前的community没有关联。

**编辑2:我要提取尚未分配给与特定社区相关联的社区计划的所有程序名称。它们可以与与其他社区关联的社区计划相关联。用例是用户应该能够从其余名称列表中选择一个名称,并将其分配给与其社区关联的社区程序。

程序名称是全局的,尽管特定社区的社区程序的程序名称是唯一的,但是不同的社区可以将社区程序与相同的程序名称关联起来**

4 个答案:

答案 0 :(得分:1)

except_community是特定的Community,应将其排除在外。下面的代码将产生一个SQL查询:

except_relation = except_community.
  community_programs.
  select(:program_name_id)

ProgramName.
  where.not(id: except_relation)

您可以将其添加为Community模型的实例方法。

答案 1 :(得分:1)

也许像这样:

class Community < ActiveRecord::Base
  has_many :community_programs
end

class CommunityProgram < ActiveRecord::Base
  belongs_to :program_name, optional: true
  belongs_to :community
end

class ProgramName < ActiveRecord::Base
  has_many :community_programs
end

some_community            = Community.find some_community_id
programs_from_a_community = some_community.community_programs.map &:id 
program_names_to_exclude  = CommunityProgram.where(id: programs_from_a_community)
                                            .where.not(program_name_id: nil)
                                            .map { |c_p| c_p.program_name.id }
program_names             = ProgramName.where.not(id: program_names_to_exclude)

答案 2 :(得分:0)

我先前接受的答案的版本被拒绝,因此我将其添加为另一个答案。 Pavel Mikhailyuk提供的解决方案解决了我的问题。

由于我想找到最有效的查询,所以我最终对其进行了更新并使用:

if (jmg[i,j]!=[255,255,0]).any():
          jmg[i,j]=[255,255,255]

编辑:所选答案比这更有效。

答案 3 :(得分:-1)

您可以通过几种不同的方式执行此操作,具体取决于您要在哪个控制器/视图上显示它们。

在社区模型上创建一个association

has_many :unassigned_program_names, -> { where community_program_id: nil }

在ProgramName模型上创建一个scope

scope :unassigned, -> { where(community_program_id: nil) }

希望这会有所帮助。 :)