#ruby-on-rails-3
#ruby-on-rails-3
Вопрос:
Я только что создал две модели и одну «таблицу соединений». Человек, адрес (create_adresses_personss)
class Person < ActiveRecord::Base
has_and_belongs_to_many :streets
end
class Street < ActiveRecord::Base
has_and_belongs_to_many :persons
end
Теперь я хочу добавить некоторые данные в эти модели в файле db / seeds.rb. Учебник, которому я следую, просто добавляет объекты:
person = Person.create :name => 'Dexter'
street.create[{:streetname => 'street1'},
{:streetname => 'street2'},
{:streetname => 'julianave'},
{:streetname => 'street3'}]
Вопрос 1: Почему данные о лицах добавляются иначе, чем улицы? Это просто учебное пособие, которое хочет показать, что существует много способов добавления данных в seeds.rb?
Вопрос 2: В руководстве не создаются соединения / соединения в seeds.rb. Он делает это в консоли rails;
>>p1 = Person.find(1)
>>s1 = Street.find(1)
>>p1.streets << s1
Разве эти соединения не могут быть выполнены в файле seeds.rb?
Вопрос 3: Было бы лучше сделать это объединение с «rich many_to_many-ассоциацией»?
Спасибо за ваше время и терпение с новичком
Ответ №1:
1) Первый метод — создание одного объекта. Второй метод заключается в создании нескольких объектов. Однако для второго метода вам нужно будет сделать Street.create
, а не street.create
.
2) Да, вы можете сделать это в начальном файле таким же образом.
3) «Богатый много-ко-многим», о котором вы говорите, — это ассоциация с моделью объединения, я полагаю, вы говорите. Это противоречит простой таблице соединений, что has_and_belongs_to_many
и делает. Чтобы использовать модель соединения, вам нужно посмотреть вверх has_many :through
. Обычно считается, что лучше всегда использовать правильную модель соединения, однако я все еще использую HABTM, когда мне просто нужна быстрая и простая ассоциация. has_many :through
предоставляет больше возможностей и больше гибкости, но его немного сложнее настроить (хотя и не так много). Это ваше решение.
Ответ №2:
Один из способов, которым мне нравится создавать исходные данные для ассоциаций «многие ко многим», — это настройка одной из моделей, добавление блока tap, который настраивает другие модели через ассоциацию.
Person.create!(:name => "Fubar").tap do |person|
3.times do |n|
person.streets.create!(:streetname => "street #{n}")
end
# OR
person.streets.create!([
{:streetname => "street 1"},
{:streetname => "street 2"},
... and so on
])
end
Все, что делает tap, — это выполнение блока с объектом в качестве единственного параметра. Я нахожу это удобным для семян.
Еще один совет, который я бы оставил, заключался в том, чтобы имена атрибутов вашей модели располагались на словах с подчеркиванием.
:street_name instead of :streetname
Разница становится более существенной, когда вы начинаете хотеть использовать некоторые из помощников ActiveSupport, которые принимают атрибуты модели и превращают их в текстовые строки для использования в пользовательском интерфейсе.
e
:streetname.to_s.titleize # «Название улицы»
:street_name.to_s.titleize # «Название улицы»
И еще одна последняя придирка: вы можете захотеть, чтобы ваша таблица соединений была адресована к_на_люди, а не к_на_персоны, поскольку флектор rais будет плюрализировать person как people . То же самое относится и к вашему контроллеру в модели Person, PeopleController вместо PersonsController. Хотя, возможно, это будет работать и с людьми.
:person.to_s.pluralize # "people"
:people.to_s.singularize # "person"
:persons.to_s.singularize # "person"