【问题标题】:Rails 4 has_many association twice in the same modelRails 4 has_many 关联两次在同一模型中
【发布时间】:2016-12-23 01:19:01
【问题描述】:

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

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

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

user.rb:

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

活动.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 是更合适的方法吗?

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

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

【问题讨论】:

  • 你能描述更多吗?发生了什么,有什么错误信息吗?
  • 是的,例如,当我使用上述方法解决问题并尝试检索用户的书签时,我收到此错误:“ActiveRecord::HasManyThroughSourceAssociationNotFoundError (Could not find the source association(s )“书签”或:模型活动中的书签。尝试“has_many :bookmarks, :through => :activities, :source => '。”谢谢您的回复
  • 目前的schema怎么样,Activity有很多bookmarks吗?

标签: ruby-on-rails database migration associations


【解决方案1】:

可以的

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

如果您没有书签模型

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

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

【讨论】:

  • 这是处理它的一种方法。我试图在没有书签模型的情况下做所有事情。有什么建议?还是我应该坚持这个解决方案?
【解决方案2】:

我尝试做事的方式无效并且不起作用。就像Pradeep Sapkota暗示的那样,这类问题的解决方法很简单,如下:

用户.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

活动.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多