我有以下用户和职位关系:
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>
答案 0 :(得分:2)
ActiveRecord关系中where
和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")
所以你要做的实际上是给你哈希(用户集),但实际上你只想让一个用户创建相关的帖子。
答案 1 :(得分:0)
您的代码
User.where(:id => 1)
不会为您提供模型实例,而是relation。因此,ActiveRecord :: 关系上的NoMethodError
。
将第一行更改为
User.find(1)
你没事。
答案 2 :(得分: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")