Ruby on rails 拥有并属于多个或通过活动记录的示例拥有多个

Ruby on rails 拥有并属于多个或通过活动记录的示例拥有多个,ruby-on-rails,ruby-on-rails-3,activerecord,database-schema,Ruby On Rails,Ruby On Rails 3,Activerecord,Database Schema,假设我有一个虚构的租车申请 我有用户、汽车和地址 user (id, name, email) has_many :addresses has_many :cars car (id, name) belongs_to :user address (id, name, user_id) belongs_to :user 每个用户都有多个地址和汽车。地址是用户可以借车的位置 现在,对于这个模型,我想做以下工作(假设用户#1有2个地址和3辆车): 我认为可以创建一个表cars\u

假设我有一个虚构的租车申请

我有用户、汽车和地址

user (id, name, email)
  has_many :addresses
  has_many :cars

car (id, name)
  belongs_to :user

address (id, name, user_id)
  belongs_to :user
每个用户都有多个地址和汽车。地址是用户可以借车的位置

现在,对于这个模型,我想做以下工作(假设用户#1有2个地址和3辆车):

我认为可以创建一个表
cars\u addresses
(id,car\u id,address\u id,available:bool)

但我不知道如何用活动记录指定。因此,我的问题是:

  • 这是正确的模式结构吗
  • 我如何通过活动记录实现这一点

这取决于您的“汽车”型号代表什么

如果它是一辆不能同时在多个位置的实体车,那么另一种关系可以:

car (id, name, location_id)
    belongs_to :user
    belongs_to :location

location (id, name, user_id)
    belongs_to :user
    has_many :cars
这将使关系发挥作用:

#list each car and it's location
current_user.cars.each do |car| { puts "#{car.name} is at #{car.location.name}" }  

要设置汽车的位置,请执行以下操作:

#move car with id=5 to location with id=15
c=Car.find(5)
l=Location.find(15)
c.location=l
c.save


顺便说一句,我建议你把你的型号命名为“地点”,而不是“地址”。Ruby会自动生成许多模型名称为复数的方法,因此使用简单的复数形式的单词可以帮助您避免一些混淆。

您需要的是,在cars和address之间有很多has_和_besible_。然而,很多rubbyists会说,这种关系永远不应该被使用(而且应该使用很多:through),这是一个完美的地方,因为我想不出任何需要在这些模型之间存储的额外信息。因此,这将是:

user (id, name, email)
  has_many :addresses
  has_many :cars

car (id, name)
  belongs_to :user
  has_and_belongs_to_many :addresses

address (id, name, user_id)
  belongs_to :user
  has_and_belongs_to_many :cars
然后,您需要创建没有id的表地址\u cars(订单很重要,不需要模型),并且有两个collumns:address\u id和car\u id。就是这样!它将“神奇地”工作:

user.cars.first.addresses=>位置车列表可用
user.addresses.first.cars=>地址下可用的汽车列表
user.addresses.first.cars将汽车添加到给定地址

谢谢您的回复。在我的模型中,一辆车可以同时在多个位置:它们代表了汽车的可用位置。所以我会和哈伯顿一起去。
#move car with id=5 to location with id=15
c=Car.find(5)
l=Location.find(15)
c.location=l
c.save
c=Car.find(5)
c.location_id=15
c.save
user (id, name, email)
  has_many :addresses
  has_many :cars

car (id, name)
  belongs_to :user
  has_and_belongs_to_many :addresses

address (id, name, user_id)
  belongs_to :user
  has_and_belongs_to_many :cars
user.cars.first.addresses => list of location car is available
user.addresses.first.cars => list of cars available under address
user.addresses.first.cars << user.cars.first => add a car to given address