2012-01-15 6 views
0

У меня есть три модели: RaceCards, Races and Wagers.Как применить динамические условия к Rails 3 has_many: через ассоциацию

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 

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

Update: Я теперь попробовал решение, предложенное 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

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

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 
+0

Я надеялся поставить условие внутри ассоциации. Будет что-то вроде этой работы:: condition => {wager_nbr => races.race_nbr} – Mutuelinvestor

+0

Почти, см. Отредактированный ответ выше – PinnyM

+0

Я думал, что у нас это было, но когда я попытался в консоли, я получил следующее: Wager Load (0.0ms) SELECT «ставки». * FROM «ставки» WHERE «ставки». «Id» = 1 LIMIT 1 Race Load (2.0ms) SELECT «race». * FROM «races» INNER JOIN «race_cards» ON «гонки». race_card_id "=" race_cards "." id "WHERE" race_cards "." id "= 1 AND (races.race_nbr = wagers.race_nbr) ActiveRecord :: JDBCError: [SQLITE_ERROR] Ошибка SQL или отсутствующая база данных (нет такого столбца: ставки .race_nbr). Похоже, мне почему-то нужно, чтобы Wager добавил к соединению. – Mutuelinvestor

Смежные вопросы