我正在使用ruby 2和rails 4.0.2。我创建了两个模型,一个是Post,第二个是blog_type。
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
现在在rails控制台上,当我使用此命令创建Post对象时
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 :(得分:0)
您已设置关系,但您只创建了对象@post
,但您尚未设置关系。
您需要创建帖子并设置blog_type:
post = Post.new
type = BlogType.new
post.blog_type = type
答案 1 :(得分: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
告诉rails使该列成为引用另一个表中名为blog_type_id
的列的外键。外键以其对应的表名命名,因此它将显示在id
表的blog_type
列中。这样,当您在模型中声明关系时,rails会自动为您提供相应的方法,如
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" >
这是实际的对象。