Пользовательский метод ассоциации - это можно сделать - PullRequest
4 голосов
/ 25 января 2012

У меня есть три модели: Wager, Race, RaceCard и WagerType.Я создал ассоциацию has_many в Wagers и добавил собственный метод ассоциации (in_wager).Целью метода является фильтрация правильных рас для каждой ставки.(Некоторые ставки охватывают несколько рас).Я хотел бы иметь возможность сделать что-то вроде: Wager.first.races.in_wager и вернуть соответствующие расы.

class Wager < ActiveRecord::Base
  belongs_to :wager_type
  belongs_to :race_card
  has_many :races, :through => :race_card do
     def in_wager 
       where('races.race_nbr BETWEEN ? AND ?', a, b)
     end
  end
end

Мой пользовательский метод работает нормально, если я жестко закодировал значения для a и b, однако мне нужно, чтобы эти значения были динамическими.В частности, значение b должно равняться атрибуту race_nbr из модели Wager:

b = wagers.race_nbr

, а значение a должно равняться b за вычетом количества гонок для конкретного типа ставок (известных как ноги) плюс 1:

a = b - Legs + 1  

Значение для ног находится в модели WagerType.Примечание. Вейджеры принадлежат WagerType и WagerType has_many.Следовательно, a можно выразить как:

a = (b - (select wager_types.legs where wagers_types.id = wagers.wager_type_id) + 1)

МОЙ Вопрос: действительно ли это возможно сделать с помощью моего метода ассоциации in_wager.Я уже несколько вечера бьюсь об этом и не могу понять, как правильно назначить значения a и b.Также, если вы чувствуете, что я ошибаюсь, я был бы рад услышать альтернативные подходы.Спасибо за вашу помощь.

Примечание: я никогда не упоминал модели RaceCard или Races.У них есть следующие ассоциации:

class RaceCard < ActiveRecord::Base
  has_many :races
end

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

Обновление: вчера вечером я читал шаблоны проектирования в Ruby и наткнулся на Proc.Я собираюсь посмотреть, смогу ли я использовать его в методе Association для вычисления значений a и b.

Ответы [ 2 ]

14 голосов
/ 01 февраля 2012

вы можете использовать self.proxy_association.owner, чтобы получить родительский объект внутри метода ассоциации. Оттуда вы можете получить нужные значения.

Если я правильно понимаю ваши модели, тогда код должен выглядеть примерно так.

class Wager < ActiveRecord::Base
belongs_to :wager_type
belongs_to :race_card
  has_many :races, :through => :race_card do
    def in_wager
      owner = self.proxy_association.owner
      b = owner.race_nbr
      a = b - owner.wager_type.legs + 1
      where('races.race_nbr BETWEEN ? AND ?', a, b)
    end
  end
end

Я получил это из ссылки Rails api на Расширения ассоциации (ссылка на proxy_association находится внизу раздела).

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

Вам обязательно нужно использовать отношение has_many? может быть, вы могли бы просто создать метод в классе Wager

def races
  b = self.race_nbr
  a = b + self.race_card.legs
  Races.find_by_race_card_id(self.id).where('race_nbr BETWEEN ? AND ?', a, b)
end 

Я не совсем понимаю вашу модель, поэтому запрос, конечно, неверный, но вы поняли ...

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