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



我的数据库中有一个名为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>

这是正确的:我不应该获取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>]>

我该怎么做?有可能做到吗?

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

例如,在event.rb

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

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

每当您想查找主要记录时,都可以这样做:@event.主要或者如果您需要替代@event.备选(请注意,Rails 会将此值视为数据库中的整数,如 0、1、2(

这只是一个建议,因为相同的表不需要多个关系,如果您只想显示"main"中的一条记录,则可以在模型中应用一些逻辑,或者只应用@event.main.first或last。

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

我希望这有帮助

最新更新