2014-02-16 5 views
0

Я пытаюсь получить правильную ассоциацию для своих моделей и не могу понять ее.Модели ассоциаций Rails

У меня есть 3 модели, Bat, Manufacturer, & Review. Вот мои модели:

class Bat < ActiveRecord::Base 
    has_many :reviews 
    has_one :manufacturer 
end 

class Manufacturer < ActiveRecord::Base 
    has_many :bats 
end 

class Review < ActiveRecord::Base 
    belongs_to :bat 
end 

В модели обзора, он имеет поле bat_id & manufacturer_id. В модели Bat используется поле manufacturer_id.

Я пытаюсь правильно связать модель производителя с моделью летучей мыши. Я просмотрел http://guides.rubyonrails.org/association_basics.html#self-joins, и я не уверен, что это тип отношений, которые мне нужны.

Это правильно или я что-то упускаю?

ответ

1

Как вы можете видеть по документам самосоединения, самосоединение используется для присоединения модели к себе. Вам не нужно это делать, потому что производитель не принадлежит другому производителю каким-либо образом (по крайней мере, не из того, что я могу сказать из вашего описания).

Кроме того, ваша модель обзор не должен быть связан с моделью изготовителя (он же, вам не нужно manufacturer_id на модели обзора.

Ваша модель летучая мышь должна иметь belongs_to :manufacturer, потому что он принадлежит к производителю, это не один вы можете прочитать больше о belongs_to против has_one здесь:.. http://guides.rubyonrails.org/association_basics.html#choosing-between-belongs-to-and-has-one

все, что вам нужно, это manufacturer_id на вашем столе Бат и bat_id на вашем столе обзорной Тогда вы будете иметь возможность использовать все магия Rails, например

bat.manufacturer # get the manufacturer of a bat 
manufacturer.bats # get all the bats from a manufacturer 
bat.reviews # get all the reviews for a bat 

Очевидно, что вам нужно будет создать миграции для добавления полей в базу данных, например

rails generate migration add_manufacturer_id_to_bat manufacturer_id:integer 
rails generate migration add_bat_id_to_review bat_id:integer 
rake db:migrate 
+0

Ладно спасибо, что имеет смысл. Я использую manufacturer_id в моей таблице обзоров, потому что это позволяет мне создать форму с двумя выпадающими выборками. В одном раскрывающемся списке пользователь выбирает производителя, а в другом - имя bat. Я хотел бы использовать javascript (работая над этим на http://www.chasepursley.com/dynamic-select-slash-dropdown-menus-with-rails-3-plus-on-the-client-side), чтобы позволить для хорошего пользовательского интерфейса. Было бы неплохо сохранить bat_id в таблице обзора на основе динамических падений, но я не могу понять это. (вот почему у меня есть bat_id & manufacturer_id) – Daniel

+0

Я пытался выяснить, как решить эту проблему здесь http://stackoverflow.com/questions/21690556/rails-multiple-input-field-in-form-to-one -integer-attribute-in-model – Daniel

+0

Я не могу заставить 'bat.manufacturer' работать, только' bat.manufacturer_id' покажет целое число. – Daniel

0

Поскольку у вашего производителя много летучих мышей, ваша летучая мышь принадлежит одному производителю, поэтому я думаю, что смена has_one :manufacturer на belongs_to :manufacturer решит вашу проблему.

-1

Изменить свой Bat класс для

class Bat < ActiveRecord::Base 
    has_many :reviews 
    belongs_to :manufacturer 
end 
+0

Этот ответ верный. Оп говорит, что летучая мышь «имеет одного производителя», в то время как производитель «имеет много летучих мышей». для каждого 'has_many' или' has_one' требуется другая команда 'own_to'. вы не можете иметь два 'has_ *' на обоих концах ассоциации модели. – ahnbizcad

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