Реализуйте полиморфную ассоциацию has_one с рельсами - PullRequest
0 голосов
/ 13 июня 2018

Я работаю с пространственными данными с помощью postgis.

У меня есть общая таблица poi с данными в качестве имени, адреса, долготы и широты

Я тоже работаю с гемом friendly_id

Я хотел бы получить жилье, питание и города из Poi.

Один Poi имеет одно размещение или одно питание или один город

У меня есть много функций, которыеработает для Poi.

Я хотел бы получить данные для каждого вида по poi.

Я думаю, что должен построить систему с полиморфной ассоциацией has_one ... но я неНе знаю, как лучше это сделать.

Что я хотел бы сделать?

Позвонить в Poi с разными областями (питание, проживание и т. д.) от friendly_id.

Например, я хотел бы позвонить

Poi.accomodation Poi.города Poi.catering

И для каждого из них должен быть специальный рендеринг.

Любая помощь приветствуется ... Я новичок на рельсах ... и мой английский нелучше: (

модель Poi:

class Poi < ApplicationRecord
   extend FriendlyId
   friendly_id :name_and_zip_code, use: :slugged
   has_one :town, as: poitable
   has_one :accomodation, as poitable

модель города:

class Town < ApplicationRecord
 belongs_to :poitable

end

модель питания:

class Accomodation < ApplicationRecord
  belongs_to :poitable
end

но у меня ошибка, У Пои не может быть обоих .....

Редактировать 1

Что я должен делать?

class Poi < ApplicationRecord
   extend FriendlyId
   friendly_id :name_and_zip_code, use: :slugged
   geocoded_by :full_address
   has_one :town, as: :poitable
   has_one :accomodation, as: :poitable

class Accomodation < ApplicationRecord
  belongs_to :poitable, polymorphic: true

class Town < ApplicationRecord
  belongs_to :poitable, polymorphic: true

В дБ:Миграция:

class CreatePois < ActiveRecord::Migration[5.1]
  def change
     create_table :pois do |t|
      t.string :name
      t.st_point :lonlat, geographic: true
      t.st_point :lonlatheight, geographic: true, has_z: true
      t.belongs_to :user, index: true
      t.references :poitable, polymorphic: true, index: true
    end
  end
end

дБ: миграция Размещение

class CreateAccomodations < ActiveRecord::Migration[5.1]
  def change
    create_table :accomodations do |t|
     t.string :genre
    end
  end
 end

дБ: миграция города

class CreateTowns < ActiveRecord::Migration[5.1]
  def change
    create_table :towns do |t|
    t.string :department
   end
 end
end

В эрбе я могу создать Poi, но:

  • Poitable_id: nil
  • Poitable_type: nil

Но я не могу создать город или жилое помещение ... У меня есть откат: (

Как я могу это исправить?

1 Ответ

0 голосов
/ 14 июня 2018

Я думаю, что ваши модели должны быть такими:

Модель Poi:

class Poi < ApplicationRecord
  extend FriendlyId
  friendly_id :name_and_zip_code, use: :slugged
  has_one :town, as: :poitable
  has_one :accomodation, as: :poitable

Модель города:

class Town < ApplicationRecord
  belongs_to :poitable, polymorphic: true
end

Модель питания:

class Accomodation < ApplicationRecord
  belongs_to :poitable, polymorphic: true
end

P / S: Для получения дополнительной информации об ассоциациях.Вы можете взглянуть на это направляющие

...