Ruby on rails 如何在rails中链接正常范围和动态范围

Ruby on rails 如何在rails中链接正常范围和动态范围,ruby-on-rails,ruby,ruby-on-rails-4,model,chaining,Ruby On Rails,Ruby,Ruby On Rails 4,Model,Chaining,我试图链接一些作用域方法(),但在组合它们时遇到了问题。我现在有下面的代码工作,但它不是完全干。 如果我能写下这样的东西会更好 Project.from_advertisers(advertiser_ids).active 及 不必使用我创建的单独方法“active_from_advisors”和“finished_from_advisors”,正如我下面的代码所示。这些单独的方法可以工作,但是像上面这样的首选链式方法会给我一个错误,第一个是数组 是否有可能在模型内部以某种方式实现这一点 谢谢

我试图链接一些作用域方法(),但在组合它们时遇到了问题。我现在有下面的代码工作,但它不是完全干。 如果我能写下这样的东西会更好

Project.from_advertisers(advertiser_ids).active

不必使用我创建的单独方法“active_from_advisors”和“finished_from_advisors”,正如我下面的代码所示。这些单独的方法可以工作,但是像上面这样的首选链式方法会给我一个错误,第一个是数组

是否有可能在模型内部以某种方式实现这一点

谢谢你的帮助

#### campaign.rb
# datetime   :start_on
# datetime   :end_on
# integer    :advertiser_id
class Campaign < ActiveRecord::Base
  belongs_to :project
  belongs_to :advertiser

  def self.active
    self.select{|c| c.end_on >= Time.now && c.start_on <= Time.now }
  end

  def self.finished
    self.select{|c| c.end_on <= Time.now }
  end
end

#### project.rb
class Project < ActiveRecord::Base
  has_many :campaigns

  def self.active
    includes(:campaigns).joins(:campaigns).select{|p| p.end_on >= Time.now && p.start_on <= Time.now }
  end

  def self.finished
    includes(:campaigns).joins(:campaigns).select{|p| p.end_on && p.end_on <= Time.now }
  end

  def self.from_advertisers(advertiser_ids)
    includes(:campaigns).joins(:campaigns).select{|p| advertiser_ids.include?(p.advertiser_id)}
  end

  def self.active_from_advertisers(advertiser_ids)
    includes(:campaigns).select{|p| advertiser_ids.include?(p.advertiser_id) && p.end_on >= Time.now && p.start_on <= Time.now }
  end

  def self.finished_from_advertisers(advertiser_ids)
    includes(:campaigns).select{|p| advertiser_ids.include?(p.advertiser_id) && p.end_on && p.end_on <= Time.now }
  end

  def advertiser_id
    campaigns.first.try(:advertiser_id)
  end

  def start_on
    campaigns.map(&:start_on).min
  end

  def end_on
    campaigns.map(&:end_on).max
  end
end
#####campaign.rb
#日期时间:开始
#日期时间:结束
#整数:广告客户id
类活动self.select{c | c.end_on>=Time.now&&c.start_on使用
。select
将始终返回一个数组

您可以考虑使用<代码>在< < /Cord>方法> < /P>中更改查询。

def self.active
    where("end_on >= #{Time.now} && start_on <= #{Time.now}")
end
def self.active

where(“end_on>={Time.now}&&start_on@manu29.d答案正确,您应该接受。
where
将返回一个ActiveRecord::Relation,您可以对其应用其他作用域。很好!这就成功了。您的代码对我不起作用,但当我将其更改为where()结束>=?开始没有问题。你是否也碰巧知道我如何将另一个方法选择{p | advertiser_id.include?(p.advertiser_id)}重写为where函数而不成为where链?谢谢!这是
活动。advertiser_id
对吗?你的查询将是
包含(:活动)。where('campetings.advertiser_id in(?),广告商ID)。参考(:活动)
。这应该有效。请参考此以了解更多信息。请注意上面的代码
位置(“结束时间>={Time.now}&&start_on=?&&start_on>
def self.active
    where("end_on >= #{Time.now} && start_on <= #{Time.now}")
end