1

我有以下用户和帖子关系:

class User < ActiveRecord::Base
  attr_accessible :email, :password, :password_confirmation

  has_many :posts
end


class Post < ActiveRecord::Base
  attr_accessible :content

  belongs_to :user
end

我正在尝试通过用户创建新帖子,但出现错误。我不确定为什么:

1.9.3-p392 :001 > @user = User.where(:id => 1)
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1
 => [#<User id: 1, email: "test@test.com", encrypted_password: "$2a$10$ltpBpN0gMzOGULVtMxqgueQHat1DLkY.Ino3E1QoO2nI...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 6, current_sign_in_at: "2013-03-04 05:33:46", last_sign_in_at: "2013-03-03 22:18:17", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2013-03-02 03:41:48", updated_at: "2013-03-04 05:33:46", avatar_file_name: nil, avatar_content_type: nil, avatar_file_size: nil, avatar_updated_at: nil>] 
1.9.3-p392 :002 > @user.posts.create(:content => "This is the content")
NoMethodError: undefined method `posts' for #<ActiveRecord::Relation:0x000000024ca868>
4

3 回答 3

2

whereActiveRecord 关系之间存在差异find

查询:

@user = User.where(:id => 1)正在给你的数组哈希。

因此,当您@user.posts对上述查询执行类似操作时,它会给出错误,NoMethodError on ActiveRecord::Relation因为没有与此哈希关联的此类帖子。因此,为了将其转换为 id 为 1 的用户,您可以这样做:

@user = User.where(:id => 1).first 

或者

@user = User.find(:id => 1)

两者都会为您提供 id 为 1 的用户(只有一条记录),然后您可以使用它:

@user.posts

以上将给出 id 为 1 的用户的相关帖子。

然后你可以这样做:

@user.posts.create(:content => "Post of user 1")

所以你要做的实际上是给你散列(一组用户),但实际上你只希望一个用户创建相关的帖子。

另外,请参阅find 和 where 之间的区别

于 2013-03-04T09:05:01.190 回答
0

你的代码

User.where(:id => 1)

没有给你一个模型实例,而是一个关系。因此NoMethodError在 ActiveRecord:: Relation上。

将您的第一行更改为

User.find(1)

你很好。

于 2013-03-04T08:45:17.923 回答
0

用这个

@user = User.where(:id => 1).shift
@user.posts.create(:content => "This is the content")

或者

@user = User.find(1)
@user.posts.create(:content => "This is the content")
于 2013-03-04T09:51:05.070 回答