如何使用外键将预订表连接到汽车表

时间:2018-08-14 03:33:59

标签: ruby-on-rails foreign-keys

我正在尝试创建一种预订功能,用户可以在特定时间内预订汽车:

我已经使用devise设置了所有用户功能,这就是我当前的用户模型:

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable, :recoverable,
      :rememberable, :trackable, :validatable,
      :omniauthable, :omniauth_providers => [:facebook , :google_oauth2]
end

我还创建了一个使用g形导轨的汽车脚手架,这些脚手架容纳以下字段:namemakemodelnumber_platecolor

这是我目前的汽车型号:

class Car < ApplicationRecord
end

我想制作一个连接到两个桌子的预订支架。这样,当用户进行预订时,他们可以在预订表单中输入汽车名称,并将预订与具有相同名称的汽车相关联。

我正在考虑像这样运行脚手架命令:

rails g scaffold Booking user:references car:references start_time:string end_time:string car_name:string 

其中的汽车名称是用来将预订链接到特定汽车的

,然后在模型中指定关系:

class User < ApplicationRecord
  has_many :bookings
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable, :recoverable,
      :rememberable, :trackable, :validatable,
      :omniauthable, :omniauth_providers => [:facebook , :google_oauth2]   
end 

class Bookings < ApplicationRecord
    belongs_to :user
    has_one :car , :foreign_key => "car_name",
end

class Car < ApplicationRecord
    belongs_to and has_many :bookings
end

我还没有尝试制作预订支架,我只是想问一问我在开始之前是否朝着正确的方向前进。任何提示将不胜感激

1 个答案:

答案 0 :(得分:0)

您需要的只是一个标准的加入模型:

class User < ApplicationRecord
  has_many :bookings
  has_many :cars, through: :bookings
end 

class Bookings < ApplicationRecord
  belongs_to :user
  # KISS. Just use an id for the foreign key
  belongs_to :car 
end

class Car < ApplicationRecord
  has_many :bookings
  has_many :users, through: :bookings
end
  

我想制作一个预订支架,将其连接到   表。这样,当用户进行预订时,他们可以输入汽车   名称输入预订表格,它将使预订与   具有相同名称的汽车。

实际上,这注定不是非常用户友好,因为用户必须输入与数据库中的值完全相同的名称。您还希望遵守约定并将ID用于外键关联KISS。而是创建一个选择:

<%= form_for(@booking) do |f| %>
  <div class="row">
    <%= f.label :car_id, 'Select your car' %>
    <%= f.collection_select :car_id, Car.all, :id, :name %>
  </div>
<% end %>

如果您确实想拥有该功能,则应将其实现为AJAX autocomplete *。