НОВИЧОК: исправьте seeds.rb в rails 3

#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"