我的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:我要提取尚未分配给与特定社区相关联的社区计划的所有程序名称。它们可以与与其他社区关联的社区计划相关联。用例是用户应该能够从其余名称列表中选择一个名称,并将其分配给与其社区关联的社区程序。
程序名称是全局的,尽管特定社区的社区程序的程序名称是唯一的,但是不同的社区可以将社区程序与相同的程序名称关联起来**
答案 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) }
希望这会有所帮助。 :)