Сохраняйте и получайте данные в одной и той же таблице, используя разные отношения - Ruby on rails - PullRequest
0 голосов
/ 14 июня 2019

В моей базе данных есть таблица с именем place_events

Мне нужно сохранить два типа мест в этой таблице, эти типы: один main и несколько alternate (необязательно)

Мой взгляд

Моя таблица:

create_table "place_events", force: :cascade do |t|
    t.datetime "created_at",                   null: false
    t.datetime "updated_at",                   null: false
    t.integer  "event_place_id",   limit: 4
    t.string   "event_place_type", limit: 255
    t.integer  "event_id",         limit: 4
  end

Я пытаюсь сохранить свои данные по различным отношениям, чтобы позже я мог их получить

if !params[:precint].nil?
      precint_hash = JSON.parse(params[:precint])
      precint_hash = precint_hash.except('id', 'description', '$$hashKey', 'logo')
      precint = PrecintEvent.new(precint_hash)
      @event.build_place_event(event_place: precint)
    end

    if params[:alternate_precints]
      precints_hash = JSON.parse(params[:alternate_precints])
      precints_hash.each do |precint|
        precint = precint.except('id', 'description', '$$hashKey', 'logo')
        precint = PrecintEvent.new(precint)
        @event.alternate_place_events.build(event_place: precint)
      end
    end

этот код работает и сохраняет данные в моей таблице place_events но моя проблема в том, когда я хочу получить их, получить принципал и получить альтернативы

Я пробую эти отношения в своеммодель event.rb:

has_one :place_event
has_many :alternate_place_events, class_name: PlaceEvent.name, foreign_key: 'event_id'

но это не работает

Это правильно:

@event.place_event
#<PlaceEvent id: 8, created_at: "2019-06-14 00:27:50", updated_at: "2019-06-14 00:27:50", event_place_id: 8, event_place_type: "PrecintEvent", city_event_id: nil, event_id: 15>

Это правильно: я не должен получать данные с идентификаторомномер 8

@event.alternate_place_events

        #<ActiveRecord::Associations::CollectionProxy [
    #<PlaceEvent id: 8, created_at: "2019-06-14 00:27:50", updated_at: "2019-06-14 00:27:50", event_place_id: 8, event_place_type: "PrecintEvent", city_event_id: nil, event_id: 15>, 
    #<PlaceEvent id: 9, created_at: "2019-06-14 00:27:50", updated_at: "2019-06-14 00:27:50", event_place_id: 9, event_place_type: "PrecintEvent", city_event_id: nil, event_id: 15>, 
    #<PlaceEvent id: 10, created_at: "2019-06-14 00:27:50", updated_at: "2019-06-14 00:27:50", event_place_id: 10, event_place_type: "PrecintEvent", city_event_id: nil, event_id: 15>]>

Как я мог это сделать?Возможно ли это сделать?

1 Ответ

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

Один простой способ обработки нескольких типов записей в одной и той же таблице - использовать enum.

Например, в event.rb

class Event< ActiveRecord::Base
  enum event_place_type: [ :main, :alternate]
end

Это означает, что выможно сохранить только два типа строк в столбце event_place_type, то есть «main» и «alternate».

Когда вы хотите найти основные записи, вы можете сделать это: @ event.main Или, если вам нужноalternate @ event.alternate (обратите внимание, что Rails будет обрабатывать эти значения как целые числа в БД, например, 0, 1, 2)

Это всего лишь предложение, поскольку вам не нужно больше одного отношения для одного и того жетаблиц, и если вы просто хотите показать одну запись из 'main', вы можете применить некоторую логику в модели или просто @ event.main.first или last.

Вот документация по Enum: https://api.rubyonrails.org/v5.2.3/classes/ActiveRecord/Enum.html

Надеюсь, это поможет

...