我认为你会混淆移植过程中应该如何处理的问题以及模型中应该如何处理(我不认为这是一种贬义的方式,所以请不要这么做)。
我有一个轨道放在一起5项目为你演示一下,我认为要做到:
总之,我相信你正在寻找既具有装载和存储在一个表卸载站,但将它们分别作为订单的属性引用。换句话说,你正在寻找单表继承。
这是我快建:
# app/models/order.rb
class Order < ApplicationRecord
belongs_to :loading_station, optional: true
belongs_to :unloading_station, optional: true
end
# app/models/station.rb
class Station < ApplicationRecord
end
# app/models/loading_station.rb
class LoadingStation < Station
has_many :orders
end
# app/models/unloading_station.rb
class UnloadingStation < Station
has_many :orders
end
正如你可以看到LoadingStation
和UnloadingStation
车型继承Station
模型。 Station
模型在数据库中获取一个表。
# db/migrate/20170826085833_create_orders.rb
class CreateStations < ActiveRecord::Migration[5.1]
def change
create_table :stations do |t|
t.string :comp_name1
t.string :street
t.string :street_num
t.string :zip_code
t.string :city
t.string :type, null: false
t.timestamps
end
end
end
类型列定义为一个:string
并且保持子类模型的类名,无论是LoadingStation
或UnloadingStation
。
而且订单表迁移看起来是这样的:
# db/migrate/20170826085833_create_orders.rb
class CreateOrders < ActiveRecord::Migration[5.1]
def change
create_table :orders do |t|
t.belongs_to :loading_station, null: true, index: true
t.belongs_to :unloading_station, null: true, index: true
t.string :status
end
end
end
正如你可以看到它引用LoadingStation.id
和UnloadingStation.id
。我不确定这些属性是否是强制性的,因此我将它们设置为列定义中的null: false
和Order
模型中的optional: true
。
要测试这个工程,我创建一个LoadingStation,一个UnloadingStation和一个订单数据库中的种子:
# db/seeds.rb
loading_station_1 = LoadingStation.create!(
comp_name1: "Loading Station 1",
street: "Park Ave",
street_num: "300",
zip_code: 10001,
city: "NY"
)
unloading_station_4 = UnloadingStation.create!(
comp_name1: "Unloading Station 4",
street: "Madison Ave",
street_num: "204",
zip_code: 10001,
city: "NY"
)
Order.create!(
loading_station: loading_station_1,
unloading_station: unloading_station_4,
status: "delivered"
)
为了测试这一切,只需创建数据库,运行迁移和执行的种子:
rails db:create
rails db:migrate
rails db:seed
要测试结果现场打开rails console
:
irb(main):001:0> pp Station.all
Station Load (0.3ms) SELECT "stations".* FROM "stations"
[#<LoadingStation:0x007fcb8ac39440
id: 1,
comp_name1: "Loading Station 1",
street: "Park Ave",
street_num: "300",
zip_code: "10001",
city: "NY",
type: "LoadingStation",
created_at: Sat, 26 Aug 2017 09:06:53 UTC +00:00,
updated_at: Sat, 26 Aug 2017 09:06:53 UTC +00:00>,
#<UnloadingStation:0x007fcb8ac39288
id: 2,
comp_name1: "Unloading Station 4",
street: "Madison Ave",
street_num: "204",
zip_code: "10001",
city: "NY",
type: "UnloadingStation",
created_at: Sat, 26 Aug 2017 09:06:53 UTC +00:00,
updated_at: Sat, 26 Aug 2017 09:06:53 UTC +00:00>]
irb(main):002:0> pp Order.all
Order Load (0.2ms) SELECT "orders".* FROM "orders"
[#<Order:0x007fcb8bca2700
id: 1,
loading_station_id: 1,
unloading_station_id: 2,
status: "delivered">]
irb(main):003:0> order = Order.first
Order Load (0.2ms) SELECT "orders".* FROM "orders" ORDER BY "orders"."id" ASC LIMIT ? [["LIMIT", 1]]
=> #<Order id: 1, loading_station_id: 1, unloading_station_id: 2, status: "delivered">
irb(main):004:0> pp order.loading_station
LoadingStation Load (0.2ms) SELECT "stations".* FROM "stations" WHERE "stations"."type" IN ('LoadingStation') AND "stations"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]]
#<LoadingStation:0x007fcb8c0e4390
id: 1,
comp_name1: "Loading Station 1",
street: "Park Ave",
street_num: "300",
zip_code: "10001",
city: "NY",
type: "LoadingStation",
created_at: Sat, 26 Aug 2017 09:06:53 UTC +00:00,
updated_at: Sat, 26 Aug 2017 09:06:53 UTC +00:00>
irb(main):005:0> pp order.unloading_station
UnloadingStation Load (0.3ms) SELECT "stations".* FROM "stations" WHERE "stations"."type" IN ('UnloadingStation') AND "stations"."id" = ? LIMIT ? [["id", 2], ["LIMIT", 1]]
#<UnloadingStation:0x007fcb8a36a378
id: 2,
comp_name1: "Unloading Station 4",
street: "Madison Ave",
street_num: "204",
zip_code: "10001",
city: "NY",
type: "UnloadingStation",
created_at: Sat, 26 Aug 2017 09:06:53 UTC +00:00,
updated_at: Sat, 26 Aug 2017 09:06:53 UTC +00:00>
irb(main):006:0> pp order.status
"delivered"
我希望这可以帮助你。我已将代码检查到github中,您可以在https://github.com/JurgenJocubeit/SO-41796815上访问它。
你的'Order'模型看起来如何?你有没有定义'unloading_station'关联? – usha