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

Rails 4 has_many association twice in the same model

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

我有两个模型,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

many_to_many 和 'inbetween' 模型是否更合适?

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

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

是的,你可以做到

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

如果您没有书签模型

多对多关系需要一个 table 可以用来连接两个模型。这里 User 和 Activity 是两个模型,要建立多对多关系,则必须存在另一个 table ,以便它们可以关联。这里要连接这两个 table,您可以制作并使用 user_activity table 或书签 table 以及与此 table.

关联的模型

之后您可以使用您正在遵循的方法。 享受

我尝试做事的方式无效且行不通。就像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

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

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