rails has_many通过数据插入问题

时间:2011-05-22 02:38:22

标签: ruby-on-rails activerecord

我有一个模型看起来像

的场景
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列。  但不是连接应该照顾它吗? 我在这里做错了什么?

感谢您的帮助

1 个答案:

答案 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是真的,这将是真正的多对多...但我不认为这是你想要做的。