当我的模型包含两个与同一类型对象类型的关系时,我该如何构建



我正在使用Rails 4.2.3我有一个与同一类型对象有两种关系的模型,

class MyObject < ActiveRecord::Base
  belongs_to :user
  has_many :my_object_times
…
  has_one :my_object_time, foreign_key: :linked_my_object_time_id

我的数据库中的列名是" has_one"为" linked_my_object_time_id"。我不知道如何为链接对象编写模型。我知道我需要列出两个" allats_to"条款,但是我不知道如何编写第二个条款。到目前为止,我有

class MyObjectTime < ActiveRecord::Base
  belongs_to :my_object

当我去保存我的对象时……

    my_object.linked_my_object_time = my_object_time
    my_object.save

我会收到错误" nomethoderror(未定义的方法`linked_my_object_time ='for#for#"

轨道基于关联名称神奇地侵入关联的外键及其模型名称。如果外键或模型名称与关联名称不同,则必须明确告诉Rails使用哪种类名称和外键。这样做将使您可以通过两个关系编写模型。

它应该看起来像这样:

class MyObject < ActiveRecord::Base
  belongs_to :user
  has_many :my_object_times
  has_one :linked_my_object_time, class_name: 'MyObjectTime'

这里发生了什么?我更改了HAS_ONE协会的名称,因为它需要用名称与Rails可以推断的HAS_MANY关系区分。此文件中没有名称冲突,但是如果您使用了has_many:my_object_times and has_one:my_object_time,您将无法区分MyObjectTime模型中的关联(即属于属于:属于allats_to:my_object)。因为我更改了关联名称,所以Rails无法再推断模型名称,因此我指定了它。但是由于铁轨通常将_id添加到关联名称中,因此它应该能够从关联名称中推断出linked_my_object_time_id的外键列。

MyObjectTime模型呢?

class MyObjectTime < ActiveRecord::Base
  belongs_to :my_object
  belongs_to :whatever_you_want_to_call_it, class_name: 'MyObject', foreign_key: 'linked_my_object_time_id'

第一个属于has_many的反向关联:my_object_times和Rails将根据预期在MyObjectTime表中查找My_object_ID列。第二个属于_TO必须具有不同的关联名称才能能够区分关联,并且由于关联名称更改,因此我必须包括班级名称和firner_key,因为不能从关联名称中推断出来。

我从这里获得了所有信息。

(编辑:固定语法联合)

创建关联时,您也可以像这样创建它

rails generate model MyObject =>父母

rails g model MyObjectTime my_object:references =>儿童

my_object.rb

class MyObject < ActiveRecord::Base
  has_one :my_object_time
end

然后,您可以从my_object_times等

引用my_object

my_object_time.my_object

最新更新