[英]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.