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