我遇到了一个小问题,但是我试图弄清楚我做错了什么已经很久了。我的场景是我有一个现有的模型user
,现在我创建另一个名为`user_comment'的模型。我创建了下面提到的细节:
用户模型:
class User < ActiveRecord::Base
has_many :user_comments
end
User_comment型号:
class UserComment < ActiveRecord::Base
belongs_to :user
end
迁移文件:
class CreateUserComments < ActiveRecord::Migration
def change
create_table :user_comments do |t|
t.integer :user_id
t.string :comments
t.timestamps
end
end
end
运行rake db:migrate
后我转到rails console
,然后设置两个表之间的关系,我做了以下操作,没有任何工作
obj1= User.first
我在user_comments表中添加了第一个新行,然后执行了..
obj2= UserComment.first
正在做obj1.obj2= obj2
给我
NoMethodError: undefined method `obj2=' for #<User:0x00000005f8e850>
from /home/insane/.rvm/gems/ruby-2.1.0/gems/activemodel-3.2.11/lib/active_model/attribute_methods.rb:407:in `method_missing'
from /home/insane/.rvm/gems/ruby-2.1.0/gems/activerecord-3.2.11/lib/active_record/attribute_methods.rb:149:in `method_missing'
from (irb):3
from /home/insane/.rvm/gems/ruby-2.1.0/gems/railties-3.2.11/lib/rails/commands/console.rb:47:in `start'
from /home/insane/.rvm/gems/ruby-2.1.0/gems/railties-3.2.11/lib/rails/commands/console.rb:8:in `start'
from /home/insane/.rvm/gems/ruby-2.1.0/gems/railties-3.2.11/lib/rails/commands.rb:41:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
请帮助我如何组建协会..
答案 0 :(得分:2)
obj1.obj2= obj2
错误,您需要obj1.obj2
和=
之间的空格。
但ob1.obj2
也没有意义(obj2
中没有User
方法。)
将对象添加到您可以执行的关联:
user = User.first
comment = UserComment.first
# if both object are not nil, then you could do below
user.user_commentes << comment
答案 1 :(得分:1)
SmileComment突然来自哪里?
无论如何,有几件事情出错了。首先,我会将您的模型名称从UserComment更改为Comment。通过您的关联已经明确了评论属于用户的事实。调用User.first.user_comments似乎有点尴尬。
让我们从一个非常基本的例子开始:
class User < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :user
end
正如您在迁移中所做的那样,注释需要user_id来引用它所属的用户。运行迁移后,调用关联很简单:
User.first.comments # Gives all comments belonging to that user
或者:
Comment.first.user # Gives the user that belongs to that comment
答案 2 :(得分:1)
obj1.obj2= obj2
=&gt;自引用循环?
您最好阅读Rails ActiveRecord associations指南 - 您会发现您正在处理的内容实际上相对简单而无法解决
正如@rails4guides.com
所述,您最好将UserComment
模型重命名为Comment
(因为这样您就可以将所需的任何数据与之关联起来 - 如果您想延迟一下):
#app/models/user.rb
Class User < ActiveRecord::Base
has_many :comments
end
#app/models/comment.rb
Class Comment < ActiveRecord::Base
belongs_to :user
end
这实际上是relational database naming conventions,因此每个表的数据可以与另一个表相关联。他们使用foreign_keys
执行此操作 - 这就是Rails如何使用模型中定义的关联来创建@user.comments
之类的内容:
class Comments < ActiveRecord::Migration
def change
create_table :comments do |t|
t.integer :user_id => this is the foreign_key, which means Rails can append these objects to your `user` object
t.string :comments
t.timestamps
end
end
end
因此,如果您想为用户提供一组注释,您只需要从模型中调用User
对象,并且由于Rails的ActiveRecord关联会通过您的模式自动调用任何关系数据,将comments
@user
与[{1}}
@user.comments
对象