Как применять условия при доступе к записям, используя отношение has_many через Rails? - PullRequest
0 голосов
/ 01 сентября 2010

У меня есть следующие модели:

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

Я пытаюсь создать функцию в модели "Кампания", которая будет возвращать только лиды, принадлежащие данному ключевому слову кампании.

Моя попытка:

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

но это не работает, условия игнорируются.

Можете ли вы найти решение этой проблемы?

Ответы [ 2 ]

1 голос
/ 01 сентября 2010

Создайте named_scope для вашей Lead модели, например, так:

class Lead < ActiveRecord::Base
  belongs_to :campaign_keyword

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

Теперь, когда вы хотите получить лиды по определенному ключевому слову кампании, вам нужно сделать так:this:

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

Это намного приятнее и более пригодно для повторного использования, потому что сама модель Lead теперь знает, как найти потенциальных клиентов для конкретной кампании.

Для большей информации о том, чтоВы можете сделать с named_scopes, посмотрите http://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/named_scope

0 голосов
/ 01 сентября 2010

Попробуйте:

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

ИЛИ

self.leads.find_all_by_compaign_keyword_id(campaign_keyword_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...