簡體   English   中英

如何在Rails中鏈接普通和動態示波器

[英]How do I chain my normal and dynamic scopes in rails

我正在嘗試鏈接一些作用域方法( 而不是使用實際范圍 ),但是在組合它們時遇到了問題。 我現在有下面的代碼可以工作,但是還不完全干。 如果我能寫些類似的東西會更好

Project.from_advertisers(advertiser_ids).active

Project.from_advertisers(advertiser_ids).finished

不必使用我創建的單獨方法“ active_from_advertisers”和“ finished_from_advertisers”,如下面的代碼所示。 這些單獨的方法可以工作,但是像上面這樣的首選鏈接方法給我一個錯誤,即第一個是數組...

是否可以在模型內部以某種方式完成此操作?

謝謝你的幫助!

#### 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

使用.select將始終返回一個數組。

您可以考慮使用where方法更改查詢。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM