Как применить динамические условия к Rails 3 has_many: через ассоциацию - PullRequest
0 голосов
/ 15 января 2012

У меня есть три модели: RaceCards, Races и Wagers.

class RaceCard < ActiveRecord::Base
has_many :races
has_many :wagers
end

class Race < ActiveRecord::Base
belongs_to :race_card
has_many :wagers, :through => :race_card
end

class Wager < ActiveRecord::Base
belongs_to :race_card
has_many :races, :through => :race_card
end

rails g model RaceCard race_card_date:date number_of_race:integer

rails g model Race race_card_id:integer race_nbr:integer

rails g model Wager race_nbr:integer race_card_id:integer wager_type:string payoff:integer

Итак, если я сделаю это в консоли:

Wager.first.races  #All races on the race card are returned. Good!

Но мне нужен способ определить, какие расы возвращаются, поэтому я добавляю условие:

if I add this:   :condition =>{:race_nbr => 1}

Wager.first.races  #Return just race 1, but this is static (always set to 1)

Мой вопрос: как мне установить условие в race_nbr в модели Wager:

:condition => {:race_nbr => wager.race_nbr}  #throws an error
:condition => {:race_nbr => self.race_nbr}   #throws an error

Я пробовал много других вещей и просто не могу этого понять. Любое руководство будет оценено. Заранее спасибо.

Обновление: сейчас я попробовал решение, предложенное PinnyM ниже

:condition => "wagers.race_nbr = races.race_nbr" #unfortunately this yields the following:

SQL error or missing database (no such column wagers.race_nbr)

1 Ответ

1 голос
/ 15 января 2012

Вы можете сделать это с помощью областей:

def Race < ActiveRecord::Base
  scope :for_race_nbr, lambda { |race_nbr| where(:race_nbr => race_nbr) }
end

def Wager < ActiveRecord::Base
  def races_for_race_nbr
    races.for_race_nbr(race_nbr)
  end
end
...