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