我有一个模型看起来像
的场景create_table :users do |t|
t.string :name
t.timestamps
end
create_table :blogs do |t|
t.string :url
t.string :title
t.text :description
t.timestamps
end
create_table :posts do |t|
t.integer :user_id, :null => false
t.integer :blog_id, :null => false
t.text :post_text
end
class Blog < ActiveRecord::Base
has_many :users, :through =>:posts
has_many :posts, :dependent=>true
end
class User < ActiveRecord::Base
has_many :blogs
has_many :posts, :through=>:blogs
end
class Post < ActiveRecord::Base
belongs_to :blog
belongs_to :user
end
我的问题是: 1.创建用户后,我想自动为他创建一个博客。
@user = User.find_or_create_by_name(user_name)
如何创建博客? @blog = Blog.find_or_create_by_user_id(@user)
我收到以下错误:
undefined method `find_or_create_by_user_id' for #<Class:0x1044735b0>
@blogs = @user.blogs
给了我:
Mysql::Error: Unknown column 'blogs.user_id' in 'where clause': SELECT * FROM `blogs` WHERE (`blogs`.user_id=1234)
我知道Blogs表没有user_id列。 但不是连接应该照顾它吗? 我在这里做错了什么?
感谢您的帮助
答案 0 :(得分:2)
要将Post模型用作关联表,需要调整User模型以正确演示关联。完成后,您可以使用after_create
为新创建的用户创建新博客。
class User < ActiveRecord::Base
has_many :posts
has_many :blogs, :through=>:posts
after_create :add_blog
private
def add_blog
blogs << Blog.new
end
end
编辑:
我知道如何处理它的最好方法是解释我“想到”关系试图完成的事情,然后你告诉我我在哪里,我们从那里开始。
1)用户可以“拥有”许多博客
2)博客可以有很多帖子
3)帖子属于单个用户和单个博客
4)博客只能有一个“所有者”(用户)
5)博客可以被许多用户“拥有”,从而允许他们发布。
如果1-4为真,5为假...这不是“has_many:through”场景或多对多关系,只是一对多关系。
因此,不应将帖子用作关联表。没有关联表。
将t.integer :user_id, :null => false
添加到博客表
class Blog < ActiveRecord::Base
belongs_to :users,
has_many :posts, :dependent=>:destroy # rec'd error in RoR3... replaced true with :destroy
end
class User < ActiveRecord::Base
has_many :blogs, :dependent=>:destroy
has_many :posts
after_create :add_blog
private
def add_blog
blogs << Blog.new
end
end
class Post < ActiveRecord::Base
belongs_to :blog
belongs_to :user
end
如果5是真的,这将是真正的多对多...但我不认为这是你想要做的。