has_many中的关联,belongs_to in rails

时间:2014-03-31 08:33:50

标签: ruby-on-rails ruby ruby-on-rails-4 rails-activerecord model-associations

我遇到了一个小问题,但是我试图弄清楚我做错了什么已经很久了。我的场景是我有一个现有的模型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>'

请帮助我如何组建协会..

3 个答案:

答案 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对象