我的数据库中有一个名为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
我希望这有帮助