Ruby on rails 4 如何在两个模型上同时使用两个作用域中的条件

Ruby on rails 4 如何在两个模型上同时使用两个作用域中的条件,ruby-on-rails-4,activerecord,scope,associations,Ruby On Rails 4,Activerecord,Scope,Associations,我有以下型号,它们目前都具有相同的范围: Program.rb has_many: :campaigns scope :visible, -> { where(status: 1) } camapaign.rb belongs_to: programme scope :visible, -> { where(status: 1) } 我想编辑活动范围,只搜索可见的节目。理想情况下,我希望将该范围更改为: (最有可能在函数中) 但这又回来了: undefined method `c

我有以下型号,它们目前都具有相同的范围:

Program.rb

has_many: :campaigns
scope :visible, -> { where(status: 1) }
camapaign.rb

belongs_to: programme
scope :visible, -> { where(status: 1) }
我想编辑
活动
范围,只搜索可见的
节目。理想情况下,我希望将该范围更改为:

(最有可能在函数中)

但这又回来了:

undefined method `campaigns' for #<Programme::ActiveRecord_Relation:0x007f8c9677cd68>
未定义的方法“活动”#
有人能解释为什么我不能这么做吗?此外,如果有任何解决方案,我们将不胜感激?最好不使用
.joins
(但我会在这一点上接受我能得到的)


谢谢

从你的问题很难判断
状态
是节目、活动的属性,还是两者兼而有之

假设两者都有,您可以这样做:

# class Programme
has_many :campaigns
scope :visible, -> { where(status: 1) }

# class Campaign
belongs_to :programme
scope :visible, do
  joins(:programme).
    merge(Programme.visible).
    where(status: 1)
end
使用此设置,
Campaign.visible
将只返回属于可见节目的活动(其中
status==1
,不确定这是否意味着在应用程序中“可见”)

至于你为什么不能打电话

Programme.visible.campaigns.where(status: 1)
活动
是属于单个计划的集合。要求一系列节目参与其活动是没有意义的

Programme.visible.campaigns.where(status: 1)