Как спроектировать ваши драгоценные камни так, чтобы они хорошо взаимодействовали с моделями Rails? - PullRequest
0 голосов
/ 07 ноября 2011

Скажем, я написал жемчужину, которая делает ленивые звонки в Google Distance API и делает результаты доступными. Примерно так:

module GoogleDirections
  class Journey
    attr_reader :directions, :origin, :destination

    # Origin and destination can either be string addresses or
    # pairs of lat,long co-ordinates
    def initialize(origin, destination)
      @origin = origin.is_a?(Array) ? origin.join(',') : origin
      @destination = destination.is_a?(Array) ? destination.join(',') : destination
    end

    # calculate the trip distance
    def trip_distance
      @trip_distance ||= directions.inject(0){|sum,leg| sum += leg["distance"]["value"] }
    end

    # This method requests directions from Google when we need to
    def directions
      @directions ||= JSON.parse(# get the directions from )
    end
  end
end

Итак, теперь я добавляю этот драгоценный камень в свой проект Rails. У проекта Tis rails есть автобусы с пунктами назначения и направлениями. Итак, что я хочу сделать, это спросить Google о направлениях, прежде чем я сохраню маршрут в базу данных.

class Bus < ActiveRecord::Base
  before_save :set_trip_distance

  def set_trip_distance
    self.trip_distance = GoogleDirections::Journey.new(self.origin, self.destination).trip_distance
  end
end

но затем, если я добавлю метод продолжительности поездки в свой драгоценный камень, я мог бы в конечном итоге также установить его на своей модели шины. Очевидно, что если я сделаю это, я должен извлечь создание экземпляра Journey.

class Bus < ActiveRecord::Base
  before_save :set_trip_distance, :set_trip_duration

  def journey
    GoogleDirections::Journey.new(self.origin, self.destination)
  end

  def set_trip_distance
    self.trip_distance = journey.trip_distance
  end

  def set_trip_duration
    self.trip_duration = journey.trip_duration
  end
end

но методы set_trip_distance и set_trip_duration кажутся очень похожими друг на друга. Я могу представить себе случай, когда я могу установить 6 разных атрибутов маршрута в автобусе. Это заставляет меня чувствовать, что должен быть лучший шаблон дизайна, который я могу использовать здесь.

Полагаю, я мог бы спроектировать Драгоценный камень таким образом, чтобы я мог include сделать это, но при этом усилилась бы связь между Драгоценным камнем и именами столбцов на моих Автобусах, что кажется плохим?

Какой вариант лучше?

1 Ответ

0 голосов
/ 07 ноября 2011

Если вы хотите дать пользователям возможность называть свои собственные столбцы для Journey данных, это как раз то, что им нужно будет сделать.

Но если уже есть путешествие, почему бы просто не сделать его ассоциацией или обернуть его каким-то метапрограммированием?

class Bus < ActiveRecord::Base
  has_journey :journey
  # Could define journey origin/dest in terms of Bus fields:
  has_journey :journey, :origin => :starting_loc, :destination => :ending_loc
end

Тем не менее, в зависимости от того, что вы на самом деле реализуете, похоже, что шина будет иметь несколько поездок, если только это не одноразовая шина. Это позволило бы некоторые интересные вещи, такие как запланированные поездки, история путешествий и т. Д.

class Bus < ActiveRecord::Base
  has_journeys
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...