如何创建没有引用ID的条目?

时间:2016-09-06 06:54:26

标签: ruby-on-rails

我有两个模型,如

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的名称来创建这样的条目。

2 个答案:

答案 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