通过不同的关系在同一张表中保存和获取数据-Ruby on Rails

时间:2019-06-14 01:32:49

标签: ruby-on-rails ruby-on-rails-4

我的数据库中有一个名为place_events的表

我需要在该表中保存两种类型的位置,这些类型分别是main和一些alternate(可选)

My view

我的桌子:

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>

这是正确的: 我不应该获取ID号为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 :(得分:0)

处理同一表中多种记录的一种简单方法是使用enum

例如,在event.rb

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

这意味着,您只能将两种类型的字符串保存到event_place_type列中,即“ main”和“ alternate”。

只要您想查找主要记录,就可以这样做: @ event.main 或者如果您需要备用 @ event.alternate (请注意,Rails将在数据库中将此值视为整数,例如0、1、2)

这只是一个建议,因为对于同一张表,您将不需要多个关系,并且如果您只想显示“ main”中的一条记录,则可以在模型中应用某些逻辑,也可以仅应用@event。 main.first或last。

这是有关Enum的文档: https://api.rubyonrails.org/v5.2.3/classes/ActiveRecord/Enum.html

我希望这对您有帮助