2016-08-22 2 views
0

Я построения API в рельсах, и у меня есть 2 модели: Автомобиль, который has_one:: документМодель ассоциация по внешнему ключу, не целое

class CreateVehicles < ActiveRecord::Migration 
    def change 
     create_table :vehicles do |t| 
      t.string :uuid, limit: 36, null: false, index: true 
      t.string :license_plate_id 
      t.integer :mileage 
      t.string :mileage_unit, default: 'km' 
      t.belongs_to :user, index: true 

      t.timestamps null: false 
     end 
    end 
end 

Vehicle.rb

class Vehicle < ActiveRecord::Base 
    audited 

    include UuidConcern 

    belongs_to :user 

    serialize :response, JSON 

    has_one :vehicle_document, dependent: :destroy 
end 

VehicleDocument belongs_to:: Автомобиль

class CreateVehicleDocuments < ActiveRecord::Migration 
    def change 
     create_table :vehicle_documents do |t| 
     t.string :uuid, limit: 36, null: false, index: true 
     t.integer :status, default: 0 
     t.attachment :file 
     t.belongs_to :vehicle, index: true 
     t.timestamps null: false 
     end 
     add_index :vehicle_documents, :status 
    end 
end 

vehicle_document.rb:

class VehicleDocument < ActiveRecord::Base 
    audited 

    include UuidConcern 
    self.primary_key = :uuid 

    belongs_to :vehicle 
end 

проблема в том, что я хочу использовать uuid для идентификатора автомобиля. Я не хочу показывать реальный идентификатор вне моего API. Как я должен это делать? Должен ли я сделать это в файле миграции? модель? Должен ли я не делать этого? Большое спасибо

+0

http://stackoverflow.com/questions/750413/altering-the-primary-key-in-rails-to-be-a-string – Ilya

+0

Это не объясняет, как определить FK, но только первичный. Определение uuid как основного не является проблемой. Проблема заключается в том, что столбец vehicle_id в базе данных является строкой, а не целым числом. –

+0

Пожалуйста, разместите свои модели, чтобы мы могли видеть ассоциации, как вы их определили. Может быть, просто добавление 'foreign_key:: uuid' в соответствующие ассоциации может делать то, что вы ищете, но невозможно сказать, не видя этот код. – jaydel

ответ

1

Похоже, что проблема связана с моделированием данных, а не с рельсами. Действительно, если вы хотите знать, как сделать что-то в Rails, вы должны знать, что вы хотите сделать первым!

Так у вас есть таблицы vehicles и documents для краткости, с каждой записью documents отслеживания (принадлежность к ним) vehicle. У вас есть два варианта: использовать идентификаторы ванили, поэтому регулярные ассоциации будут использовать идентификаторы autoincrementing для отслеживания, которые вам необязательно подвергать через ваш API.

Или вы можете использовать uuid для отслеживания ассоциации в базе данных напрямую, но столбец на documents должен размещать его. В конце концов, вы не можете поместить uuid в целочисленный столбец. Таким образом, вы можете сделать documents.vehicle_id a uuid тип, а не serial/integer. (В зависимости от вашей системы баз данных)

Глядя на документацию для t.references, что приводит к connection.add_reference, дает намек на то, какие варианты доступны:

:type
Упоминание колонного типа. По умолчанию :integer.

Так что, действительно, это вопрос изменения определения столбца, чтобы отобразить правильный тип данных.

+0

отлично, спасибо большое. Я знал, что это как-то связано с моделью БД, а не с рельсами, но с тех пор, как большинство из них выполняются через рельсы, я просто хотел убедиться. в любом случае, спасибо много Джонатан, это сработало –

Смежные вопросы