Rails 4 - 关联无法正常工作

Rails 4 - association not working correctly

我使用 rails 生成器创建了 2 个模型,如下所示:

$ bin/rails g model manager name:string

$ bin/rails g model blog/post title:string manager:references

这样,我就有了 2 个模型文件:

# app/models/manager.rb
class Manager < ActiveRecord::Base
    has_many :blog_posts
end

# app/models/blog/post.rb
class Blog::Post < ActiveRecord::Base
    belongs_to :manager
end

转到 rails 控制台,我可以像这样创建一个管理器和一个 post:

$ manager1 = Manager.new
$ manager1.name = "John Doe"
$ manager1.save

$ post1 = Blog::Post.new
$ post1.title = "Hello World"
$ post1.manager = manager1
$ post1.save

在控制台上,如果我这样做:

$ post1.manager.name

效果很好。返回经理的姓名。但如果我这样做:

$ manager1.blog_posts

我希望得到经理的 post 名单。但我收到此错误:

NameError: uninitialized constant Manager::BlogPost

当我尝试在 "Blog:Category (app/models/blog/category)" 和 "Blog::Post (app/models/blog/post.rb)"

之间建立多对关系时,同样的事情发生了

更新

@Pavan 解决了我的第一个问题...基于该解决方案,我尝试这样做:

# app/models/blog/post.rb
class Blog::Post < ActiveRecord::Base
    belongs_to :manager
    has_and_belongs_to_many :blog_categories, class_name: 'Blog::Category', foreign_key: 'blog_category_id'
end

和:

# app/models/blog/category.rb
class Blog::Category < ActiveRecord::Base
    has_and_belongs_to_many :blog_posts, class_name: 'Blog::Post', foreign_key: 'blog_post_id'
end

并基于 http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association,我生成了以下迁移:

class CreateBlogCategoriesPosts < ActiveRecord::Migration
  def change
    create_table :blog_categories_posts, id: false do |t|
      t.belongs_to :blog_post, index: true
      t.belongs_to :blog_category, index: true
    end
  end
end

但是当我在控制台上尝试这个时:

$ post1 = Blog::Post.first
$ post1.blog_categories

我收到这个错误:

2.2.2 :002 > p.blog_categories PG::UndefinedColumn: ERROR: column blog_categories_posts.category_id does not exist LINE 1: ...log_categories_posts" ON "blog_categories"."id" = "blog_cate... ^ : SELECT "blog_categories".* FROM "blog_categories" INNER JOIN "blog_categories_posts" ON "blog_categories"."id" = "blog_categories_posts"."category_id" WHERE "blog_categories_posts"."blog_category_id" = ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column blog_categories_posts.category_id does not exist LINE 1: ...log_categories_posts" ON "blog_categories"."id" = "blog_cate... ^ : SELECT "blog_categories".* FROM "blog_categories" INNER JOIN "blog_categories_posts" ON "blog_categories"."id" = "blog_categories_posts"."category_id" WHERE "blog_categories_posts"."blog_category_id" =

NameError: uninitialized constant Manager::BlogPost

您在 manager.rb 中定义了 has_namy :blog_posts,因此 Rails 将查找您的案例中不存在的 classname BlogPost

您应该明确指定 classname 以告诉 Rails 使用它。

# app/models/manager.rb
class Manager < ActiveRecord::Base
  has_many :blog_posts, class_name: 'Blog::Post'
end