Rails 4 has_many在同一模型中两次关联

时间:2016-08-16 15:22:53

标签: ruby-on-rails database migration associations

以下是我当前问题的一些信息:

我有两个模型,User和Activity。用户可以创建活动并为其添加书签。

我目前有一个工作设置,允许用户创建活动,我希望修改它以便能够为它们添加书签,但没有成功。

user.rb:

class User < ActiveRecord::Base
  ...
  has_many :activities
  ...
end

activity.rb

class Activity < ActiveRecord::Base
 ...
 belongs_to :user
 ...
end

我可以这样做吗?

class User < ActiveRecord::Base
 has_many :activities
 has_many :bookmarks, :through => :activities
end

是一个带有&#39; inbetween&#39;的many_to_many建立一个更合适的方法?

关于上述方法,当我尝试检索用户的书签时,这就是我得到的:

ActiveRecord::HasManyThroughSourceAssociationNotFoundError (Could not find the source association(s) "bookmark" or :bookmarks in model Activity. 

2 个答案:

答案 0 :(得分:0)

是的,你可以做

/app/models/activity.rb文件中添加belongs_to :bookmark,如果您想belongs_to :user使用has_many :users, through: :activities,则可以添加bookmarks.rb

如果您没有书签模型

多对多关系需要一个可用于连接两个模型的表。这里User和Activity是两个模型,并且要建立多对多的关系,之间必须存在另一个表,以便它们可以相关。在这里连接这两个表,您可以创建和使用user_activity表或书签表以及与此表关联的模型。

之后,您可以使用您所遵循的方法。 享受

答案 1 :(得分:0)

我尝试做事的方式是无效的,但它不起作用。就像Pradeep Sapkota暗示的那样,这类问题的解决方案非常简单,如下所示:

User.rb

class User < ActiveRecord::Base
 has_many :activities
 has_many :bookmarks
end

Bookmark.rb(新文件)

class Bookmark < ActiveRecord::Base
 belongs_to :user
 belongs_to :activity
end

Activity.rb

class Activity < ActiveRecord::Base
 belongs_to :user  
 has_many :bookmarks
end

我们还需要创建一个新的迁移来添加书签表

class CreateBookmarks < ActiveRecord::Migration
 def change
  create_table :bookmarks do |t|
   t.belongs_to :user, index: true
   t.belongs_to :activity, index: true

   t.timestamps
  end
 end
end