我有两个模型,如
class Car < ActiveRecord::Base
has_one :handle
end
class Handle < ActiveRecord::Base
belongs_to :car
end
(这可能不是很准确,因为我现在编写了这个例子。)
汽车模型有&#39;名称&#39; string属性,它是唯一的。
创建句柄时,我想做类似
的操作Handle.create( { size: 20, car: "CarName"} )
所以关键是car
不是汽车的id而是名字。
我知道我可以这样做
Handle.create( { size: 20, car: Car.find_by_name("CarName") } )
但我想知道我是否可以通过第一个例子(通过某种方式修改模型)来实现它
更新:为了说清楚,我想创建的实际句柄条目是{size:20,car: [car id] }。因此DB应该将Car的id作为参考。我想要做的是通过指定可以识别其id的名称来创建这样的条目。
答案 0 :(得分:0)
我不确定这是一个好主意 - 它覆盖了默认的Rails行为,并隐藏了下面的某些复杂性,重构更加困难。
话虽如此,一种方法是覆盖create
类中的Handle
类方法。
class Handle < ActiveRecord::Base
belongs_to :car
def create(params={})
if params[:car_name]
car_name = params.delete(:car_name)
params.merge(car: Car.find_by(name: car_name))
end
super(params)
end
end
这应该允许您通过传递create
来呼叫car_name
,如下所示:
Handle.create(size: 20, car_name: "Some Car Name")
答案 1 :(得分:0)
我不知道你为什么要这样,但这是一种方法。
您可以在attr_accessor
课程中拥有car_name
名为Handle
的{{1}}。您可以在初始化Handle
对象时进行设置。然后添加before_validation
并设置相应的ID。
class Car < ActiveRecord::Base
has_one :handle
end
class Handle < ActiveRecord::Base
belongs_to :car
attr_accessor :car_name
before_validation :set_car_id_from_name
private
def set_car_id_from_name
self.car_id = Car.find_by(name: car_name).try(:id) if self.car_id.blank?
self.car_id
end
end
现在您可以通过
创建Handle
Handle.create(size: 20, car_name: "Some Car Name")
请注意,如果您明确设置car_id
,那么它不会更改它。 I-E
Handle.create(size: 20,car: Car.first)
在这种情况下,它将为first
汽车创建一个句柄。所以你可以通过两种方式创建handle