has_many rails 4.0.2混乱

时间:2014-01-16 02:09:35

标签: ruby ruby-on-rails-4

我正在使用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 >

2 个答案:

答案 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" > 这是实际的对象。