2014-10-26 3 views
1

Приложение представляет собой макет образовательного сайта в Rails 3.2.19. Существует модель курсов, модель студентов и модель наград. Я пытаюсь заполнить несколько записей, но, похоже, я не могу заполнять пользователей, имеющих курсы («предварительно зарегистрировать» их). Я знаю, что есть способ сделать это, но что такое синтаксис? Я пробовал каждую комбинацию, о которой я могу думать.Rails 3 как заполнить таблицу соединений с seeds.rb

Вот schema.rb

ActiveRecord::Schema.define(:version => 20141021184426) do 

    create_table "awards", :force => true do |t| 
    t.string "name" 
    t.integer "year" 
    t.integer "student_id" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    end 

    create_table "courses", :force => true do |t| 
    t.string "name" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    end 

    create_table "courses_students", :id => false, :force => true do |t| 
    t.integer "course_id", :null => false 
    t.integer "student_id", :null => false 
    end 

add_index "courses_students", ["course_id", "student_id"], 
:name =>"index_courses_students_on_course_id_and_student_id", :unique => true 

    create_table "students", :force => true do |t| 
    t.string "given_name" 
    t.string "middle_name" 
    t.string "family_name" 
    t.date  "date_of_birth" 
    t.decimal "grade_point_average", :precision => 10, :scale => 0 
    t.date  "start_date" 
    t.datetime "created_at",           :null => false 
    t.datetime "updated_at",           :null => false 
    end 

end 

это course.rb ...

class Course < ActiveRecord::Base 
    attr_accessible :name, :student_id, :course_id 
    has_and_belongs_to_many :students 
end 

student.rb ...

class Student < ActiveRecord::Base 

    attr_accessible :date_of_birth, :family_name, :given_name, :grade_point_average, 
    :middle_name, :start_date, :student_id, :courses 

    has_many :awards, :dependent => :destroy 

    has_and_belongs_to_many :courses 

    def name 
    given_name + " " + family_name 
    end 

    def enrolled_in?(course) 
    self.courses.include?(course) 
    end 

Защиту unenrolled_courses курс. найти (: все) - self.cursses конец конец

award.rb ...

class Award < ActiveRecord::Base 
    attr_accessible :name, :student_id, :year 

    # every award is linked to a student, through student_id 
    belongs_to :student 
    validates_existence_of :student, :both => false 
end 

Это seed.rb файл я получил до сих пор. Я могу назначить студенческие награды, но не курсы. Согласно схеме, я думаю, что я должен использовать автоматически сгенерированный course_id, но я не знаю, как ссылаться, что семена некоторых данных ...

Course.create(name: 'Australian History') 
Course.create(name: 'Advanced Java Programming') 
Course.create(name: 'Introduction to Rails') 
Course.create(name: 'Psychology') 

Student.create(given_name: 'Donna', middle_name: 'Louise', family_name:'Chang', 
    date_of_birth:'1981-11-04', grade_point_average: 3.55, start_date: '2014-01-13', 
    courses: Course(:name=> 'Australian History')) 

Student.create(given_name: 'Barnabas', middle_name: 'Justin', family_name:'Bulpett', 
    date_of_birth: '1966-07-28', grade_point_average: 2.83, start_date: '2012-08-15') 

Student.create(given_name: 'Cleveland', middle_name: 'Jackson', family_name:'Brown', 
    date_of_birth: '1976-02-18', grade_point_average: 3.96, start_date: '2011-08-18') 

Award.create(name: 'Heisman Trophy', year: 2012, student_id: 3) 
Award.create(name: 'Nobel Peace Prize', year: 2012, student_id: 1) 
Award.create(name: 'Best Cinematography', year: 2012, student_id: 2) 

Я надеюсь, что кто-то может помочь, это из книги (Learning Rails 3 - O'Reilly). В книге есть это приложение в примере, но я не вижу, где и как они его высевают. Спасибо, что посмотрели, любая помощь ценится много!

Редактировать: приведенное выше seeds.rb показывает попытку применить курс по имени курса (первому учащемуся). Это было сделано после попытки использования аналогичного подхода с использованием course_id.

ответ

3

Возможно, вам не хватает «где», когда вы пытаетесь найти курсы с названием «Австралийская история».

Course.create(name: 'Australian History') 
Course.create(name: 'Advanced Java Programming') 
Course.create(name: 'Introduction to Rails') 
Course.create(name: 'Psychology') 

Student.create(given_name: 'Donna', middle_name: 'Louise', family_name:'Chang', date_of_birth:'1981-11-04', grade_point_average: 3.55, start_date: '2014-01-13', courses: Course.where(name: 'Australian History')) 

Student.create(given_name: 'Barnabas', middle_name: 'Justin', family_name:'Bulpett', date_of_birth: '1966-07-28', grade_point_average: 2.83, start_date: '2012-08-15') 

Student.create(given_name: 'Cleveland', middle_name: 'Jackson', family_name:'Brown', date_of_birth: '1976-02-18', grade_point_average: 3.96, start_date: '2011-08-18') 

Award.create(name: 'Heisman Trophy', year: 2012, student_id: 3) 
Award.create(name: 'Nobel Peace Prize', year: 2012, student_id: 1) 
Award.create(name: 'Best Cinematography', year: 2012, student_id: 2) 
+0

Awesome! Он скомпилирован и отлично работает. Теперь, чтобы пройти несколько классов для этого ученика, я просто повторяю это (например, курсы: Course.where (name: 'foo'), курсы: Course.where (name: 'bar')) или есть способ передать массив или хэш? –

+1

В том месте, где вы можете передать массив: курсы: Course.where (имя: ['foo', 'bar']), он будет переведен как «IN ('foo', 'bar')" в SQL-запросе –

+0

Вы спасатель жизни! Надеюсь, другие выиграют от этого - СПАСИБО !! –

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