如何在Rails中使用has_many through关系访问记录时应用条件?

时间:2010-09-01 03:52:49

标签: ruby-on-rails activerecord

我有以下型号:

class Campaign < ActiveRecord::Base
  has_many   :campaign_keywords
  has_many   :leads, :through => :campaign_keywords
end

class CampaignKeyword < ActiveRecord::Base
  belongs_to :campaign
  has_many   :leads
end

class Lead < ActiveRecord::Base
  belongs_to :campaign_keyword
end

我正在尝试在“广告系列”模型中构建一个只返回属于给定campaign_keyword的潜在客户的函数。

我的尝试是:

def leads?(campaign_keyword_id = -1)
  self.leads :conditions => ['campaign_keyword_id = #{campaign_keyword_id}']
end

但这不起作用,条件被忽略。

你能看到解决方案吗?

2 个答案:

答案 0 :(得分:1)

Lead模型创建named_scope,如下所示:

class Lead < ActiveRecord::Base
  belongs_to :campaign_keyword

  named_scope :with_keyword, lambda { |keyword| { :conditions => { :campaign_keyword => keyword } } }
end

现在,当您想获得特定广告系列关键字的潜在客户时,您可以这样做:

def leads_for_campaign(keyword)
  self.leads.with_keyword(keyword)
end

这更好,更可重复使用,因为Lead模型本身现在知道如何找到特定广告系列的潜在客户。

如果想了解如何使用named_scopes,请查看http://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/named_scope

答案 1 :(得分:0)

试试这个:

def leads?(campaign_keyword_id = -1)
  self.leads.all :conditions => ['campaign_keyword_id = #{campaign_keyword_id}']
end

我会按如下方式重写您的查询:

def leads?(campaign_keyword_id = -1)
  self.leads.all :conditions => ['campaign_keyword_id = ?', campaign_keyword_id]
end

OR

self.leads.find_all_by_compaign_keyword_id(campaign_keyword_id)