0

我有一个房间模型。每个房间有 6 个出口(北、东、南、西、上、下),我应该可以做一些事情,比如Room.first.nr把房间带到第一个出口的北边。我制作的模型如下:

class Room < ApplicationRecord

  has_one :nr, class_name: 'Room', foreign_key: :id
  belongs_to :sr, class_name: 'Room'

  has_one :er, class_name: 'Room', foreign_key: :id
  belongs_to :wr, class_name: 'Room'

  has_one :sr, class_name: 'Room', foreign_key: :id
  belongs_to :nr, class_name: 'Room'

  has_one :wr, class_name: 'Room', foreign_key: :id
  belongs_to :er, class_name: 'Room'

  has_one :ur, class_name: 'Room', foreign_key: :id
  belongs_to :dr, class_name: 'Room'

  has_one :dr, class_name: 'Room', foreign_key: :id
  belongs_to :ur, class_name: 'Room'

end

但是,当在 rails c 中执行此操作时

Room.create!(title:'sometitle', description:'somedescription', er: Room.first)

我得到这个:

ActiveRecord::RecordInvalid: Validation failed: Sr must exist, Wr must exist, Nr must exist, Dr must exist, Ur must exist

我也一直在玩,inverse_of无济于事。

这是我的迁移:

class CreateRooms < ActiveRecord::Migration[5.0]
  def change
    create_table :rooms do |t|
      t.string :title, null: false
      t.text :description, null: false

      t.integer :nr_id, null: true
      t.integer :er_id, null: true
      t.integer :sr_id, null: true
      t.integer :wr_id, null: true
      t.integer :ur_id, null: true
      t.integer :dr_id, null: true

      t.timestamps
    end

    add_index :rooms, :nr_id
    add_index :rooms, :er_id
    add_index :rooms, :sr_id
    add_index :rooms, :wr_id
    add_index :rooms, :ur_id
    add_index :rooms, :dr_id

  end
end
4

2 回答 2

1

您有冲突的关联名称(即has_one :nrbelongs_to :nr)。应该类似于以下内容:

class Room < ApplicationRecord

  belongs_to :sr, class_name: 'Room'
  belongs_to :wr, class_name: 'Room'
  belongs_to :nr, class_name: 'Room'
  belongs_to :er, class_name: 'Room'
  belongs_to :dr, class_name: 'Room'
  belongs_to :ur, class_name: 'Room'

end

我不认为你仍然需要这些has_one关系。因为您已经可以通过这些来获得各个方向的房间belongs_to

于 2016-02-09T20:57:19.130 回答
0

好的,花了一段时间,但我想通了。

该模型采用以下形式:

class Room < ApplicationRecord

  has_one :nr, class_name: 'Room', foreign_key: 'sr_id', inverse_of: :sr

  has_one :er, class_name: 'Room', foreign_key: 'wr_id', inverse_of: :wr

  has_one :sr, class_name: 'Room', foreign_key: 'nr_id', inverse_of: :nr

  has_one :wr, class_name: 'Room', foreign_key: 'er_id', inverse_of: :er

  has_one :ur, class_name: 'Room', foreign_key: 'dr_id', inverse_of: :dr

  has_one :dr, class_name: 'Room', foreign_key: 'ur_id', inverse_of: :ur

end

所以我可以

a=Room.create(title:'the title', description: 'the description')
a.er = Room.find(1)
a.save

这是真的:

Room.find(1).wr == Room.last

无论如何谢谢@Jay-Ar Polidario

于 2016-02-09T22:08:43.533 回答