Эти отношения могут быть описаны в Ruby on Rails?

Нет никакого четкого ответа на Ваш вопрос. Это зависит полностью, как Ваши данные организованы.

Что-то для учета:

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

Деревья октантов и BVHs (Иерархии Ограничивающего объема) извлекают выгоду, если данные являются трехмерными. Это также работает очень хорошо, если Ваши геометрические объекты кластеризируются в 3D пространстве. (см. Дерево октантов по сравнению с BVH)

преимущество Oc-и Деревьев квадрантов - то, что можно прекратить генерировать деревья каждый раз, когда Вы желаете. Если Вы хотите представить графику с помощью графического акселератора, она позволяет Вам просто генерировать деревья на уровне объектов и отправлять каждый объект в единственном тянуть-вызове к графическому API. Это работает очень лучше, чем отправка отдельных треугольников (что-то, что необходимо сделать при использовании Деревьев BSP для полного объема).

Деревья BSP являются особым случаем действительно. Они работают очень очень хорошо в 2D и 3D, но генерация хороших Деревьев BSP является видом искусства самостоятельно. Деревья BSP имеют недостаток, что Вам, вероятно, придется разделить Вашу геометрию на мелкие кусочки. Это может увеличить полное количество полигона Вашего набора данных. Они хороши для рендеринга, но они намного лучше для обнаружения коллизий и трассировки лучей.

А хорошее свойство деревьев BSP - то, что они разлагают суп полигона на структуру, которая может быть отлично представлена наоборот (и наоборот) от любого положения камеры, не делая фактического вида. Порядок с каждой точки зрения является частью структуры данных и сделанный во время Древовидной BSP компиляции.

, Что, между прочим, причина, почему они были несколько настолько популярные 10 лет назад. Quake использовал их, потому что он позволил графическому механизму / растрирующий процессор программного обеспечения не использовать дорогостоящий z-буфер.

Все упомянутые деревья являются просто семьями деревьев. Существуют свободные деревья октантов, гибридные деревья kd-деревьев и много других связанных структур также.

5
задан y0mbo 17 November 2009 в 21:37
поделиться

3 ответа

Приведены такие определения таблиц:

create_table :addresses do |t|
  t.string :street
  t.string :city
  t.string :state
  t.string :zip
  t.timestamps
end

create_table :customers do |t|
  t.string     :name
  t.references :shipping_address
  t.references :billing_address
  t.timestamps
end

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

class Customer < ActiveRecord::Base
  belongs_to :shipping_address, :class_name => "Address"
  belongs_to :billing_address,  :class_name => "Address"
end
2
ответ дан 14 December 2019 в 08:53
поделиться

Да, это прекрасно возможно это сделать. Для таблицы клиентов с двумя внешними ключами shipping_address_id и billing_address_id для таблицы адресов , ваша модель Customer может выглядеть так:

class Customer < ActiveRecord::Base
  belongs_to :billing_address, :class_name => 'Address'
  belongs_to :shipping_address, :class_name => 'Address'
end

Это позволит клиенту ссылаться на одну и ту же адресную строку для адресов доставки и выставления счетов, а также позволит нескольким клиентам совместно использовать адреса.

Обновление: При совместном использовании ссылок на адреса, подобные этому, вы ' Я, вероятно, захочу внимательно рассмотреть, как обрабатывать обновления адресов. В вашем примере у Боба и Ал один и тот же адрес доставки. Сейчас, если Боб обновляет свой адрес доставки, вы, вероятно, захотите создать новую запись Address для нового адреса Боба, а не обновлять существующую запись, чтобы избежать изменения адреса Ала. Иногда вам может потребоваться обновить адреса обоих клиентов в этой ситуации, но в большинстве случаев вы, вероятно, этого не сделаете.

5
ответ дан 14 December 2019 в 08:53
поделиться

В документации для ассоциаций ActiveRecord есть раздел о has_one и own_to . Кроме того, в разделе на has_one упоминается, что это следует использовать, только если другой класс имеет внешний ключ. Итак, чтобы смоделировать то, что вы хотите, вы можете использовать.

class Address < ActiveRecord::Base
  has_one :shipto_customer, :class_name => "Customer", :foreign_key => "shipping_address_id"
  has_one :billto_customer, :class_name => "Customer", :foreign_key => "billing_address_id"
end

class Customer < ActiveRecord::Base
  belongs_to :shipping_address, :class_name => "Address"
  belongs_to :billing_address,  :class_name => "Address"
end

Пример использования:

>> customer = Customer.new(:name => "John Smith",
?>     :shipping_address => Address.new(:address => "123 M St",
?>       :city => "Phoenix", :state => "AZ", :zip => "85015"),
?>     :billing_address => Address.new(:address => "555 W Main Dr",
?>       :city => "Phoenix", :state => "AZ", :zip => "85015")
>>   )
=> #<Customer id: nil, name: "John Smith", billing_address_id: nil, shipping_address_id: nil, created_at: nil, updated_at: nil>
>> customer.save
  Address Create (0.8ms)   INSERT INTO "addresses" ("address", "city", "zip", "created_at", "updated_at", "state") VALUES('555 W Main Dr', 'Phoenix', '85015', '2009-11-14 17:03:28', '2009-11-14 17:03:28', 'AZ')
  Address Create (0.2ms)   INSERT INTO "addresses" ("address", "city", "zip", "created_at", "updated_at", "state") VALUES('123 M St', 'Phoenix', '85015', '2009-11-14 17:03:28', '2009-11-14 17:03:28', 'AZ')
  Customer Create (0.2ms)   INSERT INTO "customers" ("name", "billing_address_id", "shipping_address_id", "created_at", "updated_at") VALUES('John Smith', 1, 2, '2009-11-14 17:03:28', '2009-11-14 17:03:28')
=> true
>> customer.shipping_address
=> #<Address id: 2, address: "123 M St", city: "Phoenix", state: "AZ", zip: "85015", created_at: "2009-11-14 17:03:28", updated_at: "2009-11-14 17:03:28">
>> customer.billing_address
=> #<Address id: 1, address: "555 W Main Dr", city: "Phoenix", state: "AZ", zip: "85015", created_at: "2009-11-14 17:03:28", updated_at: "2009-11-14 17:03:28">
>> 
0
ответ дан 14 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: