我的数据库中有一个名为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>]>
我该怎么做?可以做到吗?
答案 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
我希望这对您有帮助