Как я могу создать ссылки на объекты в Ruby в ActiveRecords? - PullRequest
1 голос
/ 04 октября 2011

Я разработчик Java, я изучал Rails последние несколько дней. У меня есть приложение Java EE (использует Hibernate для ORM), которое я пытаюсь перенести на Rails. Я использовал леса для создания нескольких моих моделей. Но у меня есть другие модели, которые содержат ссылки на другие модели. Как мне определить отношения? Могу я это тоже пометить?

Вот пример того, что я пытаюсь сделать.

public class Engine {
    private int valves;
    private int capacity;
    private int rpm;
}

Я могу создать класс Engine в ruby, выполнив следующие действия:

rails generate scaffold Engine valves:integer capacity:integer rpm:integer

Вот сложная часть для меня:

public class Car {
    private Engine engine;
}

Как я строю класс Car в Ruby?

Ответы [ 4 ]

3 голосов
/ 04 октября 2011

Если я правильно понимаю, вы ищете ассоциации.Вот вам замечательное руководство , которое вы должны прочитать.Здесь нужно понимать, что вы определяете в своих моделях, как они связаны друг с другом, с помощью ряда методов, описанных в этом руководстве.

Вот что я бы посоветовал вам сделать:

rails generate scaffold Car <db columns>
rails generate model Engine valves:integer capacity:integer rpm:integer car_id:integer

В ваших двух моделях:

class Car < ActiveRecord::Base
  has_one :engine
end 

class Engine < ActiveRecord::Base
  belongs_to :car
end

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

accepts_nested_attribues_for :engine

к вашей модели автомобиля.Это позволит вам управлять манипуляциями с моделью двигателя из контроллера и представлениями модели автомобиля.

В любом случае, я надеюсь, это поможет вам начать находить то, что вам нужно.

1 голос
/ 04 октября 2011

Нет никаких лесов для отношений, вы должны научиться делать это "вручную" (что не слишком требовательно).Взгляните на «Rails Guides» , а здесь «Active Record Association» .

В вашем примере вам нужно выполнить следующие шаги:

  1. Создайте миграцию для переноса базы данных: rails g migration AddIds
  2. Измените миграцию, добавив в нее дополнительный идентификатор:

    ...
    add_column :engines, :car_id, :integer
    
  3. Добавьте к вам модели следующий код:

    class Car
      has_one :engine
      ...
    end
    class Engine
      belongs_to :car
      ...
    end
    
1 голос
/ 04 октября 2011

Вы должны узнать больше о Ruby.Ruby не является статическим языком, то есть каждая переменная может содержать любой тип объекта.

Команда rails generate использует вентили: целое число и т. Д. Только для целей базы данных, поскольку базы данных нуждаются в этой информации.

Что касается проблемы ваших отношений, вы должны прочитать о has_many, bleongs_to и т. Д. (См. http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html) В Rails вы можете определить свое отношение следующим образом

class Car
  belongs_to :engine
end

class Engine
  has_many :cars
end

Более того, вы должны добавить внешний ключ engine_id в Car.

Это работает, потому что в Rails используется несколько соглашений.

Без базового учебника вы не доберетесь далеко.

1 голос
/ 04 октября 2011

Вы можете сделать это с помощью references помощника миграции activerecord.

rails generate scaffold Car engine:references ...

добавит:

t.references :engine в вашем миграционном файле

has_many :engines в файле модели вашего автомобиля

belongs_to :car в вашем файле модели двигателя

Не забудьте проверить параметры rails api (по умолчанию, обратные вызовы отношений ...) (например, здесь: http://railsapi.com/doc/rails-v3.0.8rc1/)

...