2014-01-16 6 views
0

Я использую ruby ​​2 и rails 4.0.2. Я создал две модели, один - Post, а второй - blog_type.hash_many rails 4.0.2 beginner confussion

post.rb

class Post < ActiveRecord::Base 
belongs_to :blog_types 
validates :title, presence: true, length: { minimum: 5 } 
end 

blog_type.rb

class BlogType < ActiveRecord::Base 
has_many :posts 
end 

Сообщение Модель

------------------------------------------------------- 
| id | Title  | Text    | blog_type_id| 
------------------------------------------------------- 
| 1 | Ruby is aweso| Ruby is really ...| 1   | 
------------------------------------------------------- 
| 2 | SQL.....  | SQL is really... | 2   | 
------------------------------------------------------ 
| 3 | Java is aweso| Java is really ...| 1   | 
------------------------------------------------------- 
| 4 | QA is...  | QA is really... | 3   | 
------------------------------------------------------ 

blog_type модель

--------------------- 
| id | blog_type | 
--------------------- 
| 1 | Programming | 
--------------------- 
| 2 | Database  | 
--------------------- 
| 3 | Testing  | 
--------------------- 
| 4 | Math   | 
--------------------- 

файлы миграции

class CreatePosts < ActiveRecord::Migration 
    def change 
    create_table :posts do |t| 
     t.string :title 
     t.text :text 

     t.timestamps 
    end 
    end 
end 

class CreateBlogTypes < ActiveRecord::Migration 
    def change 
    create_table :blog_types do |t| 
     t.string :blog_type_name 

     t.timestamps 
    end 
    end 
end 

Теперь на рельсы консоли, когда я создаю сообщение объект с этой командой

bundle exec rails c --sandbox 
Loading development environment in sandbox (Rails 4.0.2) 
Any modifications you make will be rolled back on exit 
2.0.0p247 :001 > @post = Post.new 
=> #<Post id: nil, title: nil, text: nil, created_at: nil, updated_at: nil> 
2.0.0p247 :002 > 

поэтому мой вопрос я поместил отношения в модели, почему я не могу видеть эффект, когда я создаю экземпляр модели? я понимаю, когда я установил связь, после того, что, если я буду создавать экземпляр после модели, я могу видеть сильфон

2.0.0p247 :001 > @post = Post.new 
    => #<Post id: nil, title: nil, text: nil, blog_type_id: nil, created_at: nil, updated_at: nil> 
    2.0.0p247 :002 > 
+0

Можете ли вы посмотреть на свою БД и увидеть, что столбец существует в таблице? Есть ли какие-либо миграции, которые вы еще не запускали? – Beartech

+0

Как вы добавили столбец в таблицу? – meagar

+0

Попробуйте перезагрузить консоль. run 'reload!' – Santhosh

ответ

0

Вы должны добавить blog_type_id столбец в таблице Post.

rails g migration AddBlog_type_idToPost blog_type_id:references 

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

class AddBlogTypeIdToPost < ActiveRecord::Migration 
    def change 
    add_reference :posts, :blog_type_id, index: true 
    end 
end 

Не забудьте запустить миграцию: rake db:migrate ,
Вы можете создавать миграции, называемые практически любым именем. Но если вы используете синтаксис в имени, которое Rails не может определить, оно просто создаст пустую миграцию с этим именем. Существует множество ценных данных in the documentation. следующий раз создать таблицу, которая имеет внешние ключи вы можете сделать это следующим образом:

rails g migration CreatePostTable title:string text:text blog_type_id:references 

Обратите внимание, как мы объявляем blog_type_id:references Это говорит рельсы, чтобы сделать этот столбец внешнего ключа, ссылающийся на столбец blog_type_id в другой таблице , Внешние ключи называются с их соответствующим именем таблицы, поэтому он будет выглядеть в столбце id таблицы blog_type.Таким образом, когда вы объявили свои отношения в модели, рельсы автоматически дает вам соответствующие методы, как

blog = Blog.new(title: "Ruby is .... (omitted for brevity).., blog_type_id: 1) 

Теперь мы можем назвать такие вещи, как:

puts blog.name 

дает нам Ruby is awesome

puts blog.blog_type_id.name 

дает нам «программирование»

не забывайте подробно указать который поле от blog_type вы хотите или вы получите ссылку на саму

puts blog.blog_type_id 

объекта дает #<BlogType id: 1, blog_type: "Programming" > , который является фактическим объектом.

+0

@thanks, получил концепцию и работу –

0

Вы выставиться отношения, но вы только создали объект @post, вы не установите связь.

Вам нужно создать пост и установить blog_type:

post = Post.new 
type = BlogType.new 

post.blog_type = type 
Смежные вопросы