2013-04-02 2 views
1

Я знаю, что на этом уже много тем, но я не мог найти то, что я пытаюсь сделать. Я просто изучаю Rails, и хотя я знаю, что это, наверное, довольно простое решение, я в тупике.Создание ассоциаций в Rails с использованием has_many и принадлежит_to

Я создаю сайт «Временная шкала». У меня установлены учетные записи пользователей, и пользователь может создавать временные рамки. Но мне нужно связать несколько событий «событий» (элементы, которые нужно выполнить на временной шкале, модель для них называется Event) с каждой временной шкалой (модель для которой называется Timeline_Object). Проще говоря - пользователь имеет несколько временных графиков, а временная шкала имеет несколько событий.

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

class User < ActiveRecord::Base 

    has_many :timeline_objects 

    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, 
    :remember_me, :user_name 

end 


class TimelineObject < ActiveRecord::Base 

    belongs_to :user 

    attr_accessible :title, :user_id 

    has_many :events  

end 


class Event < ActiveRecord::Base 
    belongs_to :timeline_object 

    attr_accessible :date, :description, :time, :title, :image, 
    :image_width, :image_height, :timeline_objects 
    has_attached_file :image, :styles => { :large => "500x500>", :medium => "400x400#", :thumb => "100x100>" } 
    after_post_process :save_image_dimensions 

    validates :title, presence: true 
    validates :image, presence: true 
    validates :time, presence: true 
    validates :date, presence: true 

    def save_image_dimensions 
    geo = Paperclip::Geometry.from_file(image.queued_for_write[:original]) 
    self.image_width = geo.width 
    self.image_height = geo.height 
    end 
end 

После запуска некоторой миграции для установки ключей в базе данных, это то, что моя схема выглядит следующим образом:

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

    create_table "events", :force => true do |t| 
    t.string "title" 
    t.string "description" 
    t.string "date" 
    t.string "time" 
    t.datetime "created_at",   :null => false 
    t.datetime "updated_at",   :null => false 
    t.string "image_file_name" 
    t.string "image_content_type" 
    t.integer "image_file_size" 
    t.datetime "image_updated_at" 
    t.integer "image_height" 
    t.integer "image_width" 
    t.integer "timeline_objects" 
    end 

    add_index "events", ["timeline_objects"], :name => "index_events_on_timeline_objects" 

    create_table "timeline_objects", :force => true do |t| 
    t.string "title" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    t.integer "user_id" 
    end 

    add_index "timeline_objects", ["user_id"], :name => "index_timeline_objects_on_user_id" 

    create_table "users", :force => true do |t| 
    t.string "user_name" 
    t.string "email",     :default => "", :null => false 
    t.string "encrypted_password",  :default => "", :null => false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   :default => 0 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at",        :null => false 
    t.datetime "updated_at",        :null => false 
    end 

    add_index "users", ["email"], :name => "index_users_on_email", :unique => true 
    add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true 

end 

Когда я иду, чтобы показать график (в котором указать, должны быть отображены все события), я стараюсь, чтобы перебрать их с

<% @timeline_object.events.each do |event| %> 

эта строка кода выдает эту ошибку:

SQLite3::SQLException: no such column: events.timeline_object_id: SELECT "events".* FROM "events" WHERE "events"."timeline_object_id" = 4 

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

Дайте мне знать, если вам нужна дополнительная информация/код. Заранее спасибо.

ответ

1

В вашей События схеме, у вас есть:

t.integer "timeline_objects" 

, но это должно быть:

t.integer "timeline_object_id" 

Запуск новой миграции исправить:

rename_column :events, :timeline_objects, :timeline_object_id 

Поскольку каждое событие принадлежит объекту TimelineObject, тогда ему нужен столбец, который идентифицирует идентификатор объекта, с которым он связан.

+0

Это сделало. Я не понимал, что конкретно это нужно добавить с помощью _id. Спасибо за вашу помощь! – bmyers

+0

Без проблем, рад, что это сработало! – johnkoht

+0

Не забудьте обновить ссылку индекса на timeline_object_id –

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