Rails 4 - 多对多的关系

时间:2014-03-10 18:05:47

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

我有一个Bookmark模型。我想要一个List模型。所以我的用户可以创建书签列表。

我用这个命令

创建了一个List脚手架
rails generate scaffold List title:string
  1. 列表可以包含许多书签
  2. 书签可以包含多个列表
  3. 有人可以帮我创建List Bookmark关系吗?

    如果你能给我一些学习资源,那就太棒了。

    更新

      
        
    1. 书签可以包含多个列表
    2.   

    让我们说我为http://stackoverflow.com添加了书签。并说我有两个列表:

    1. 编程帮助
    2. 最喜欢的网站
    3. 然后我应该可以将我的书签添加到两个列表中。

      所以我猜A Bookmark can have many lists是一个有效的陈述。

4 个答案:

答案 0 :(得分:32)

适用于=> Rails 4:

应用/模型/ Bookmark.rb

class Bookmark < ActiveRecord::Base
  has_and_belongs_to_many :lists
end

应用/模型/ List.rb

class List < ActiveRecord::Base
  has_and_belongs_to_many :bookmarks
end

创建新迁移

rails generate migration CreateJoinTableListBookmark List Bookmark

<强>迁移

rake db:migrate

答案 1 :(得分:2)

尚未测试过,但这就是它的工作原理

class Bookmark < ActiveRecord::Base
    has_and_belongs_to_many :bookmark_lists
end

class BookmarkList < ActiveRecord::Base
    has_and_belongs_to_many :bookmarks
end

您需要为每个迁移和桥接表的迁移(我假设您想要书签和列表的标题):

rails generate model Bookmark title
rails generate model BookmarkList title
rails generate model BookmarkListsBookmarks bookmark_list_id:integer bookmark_id:integer

如果它想要发送错误,不确定是否想要BookmarkListsBookmarks或BookmarksBookmarkLists,只需尝试另一个。

答案 2 :(得分:2)

我认为有很多关系。

解决这个问题。将创建一个新模型ListBookmark。

ListBookmark基本属性: LIST_ID bookmark_id

根据要求可以添加更多属性。

class List < ActiveRecord::Base
    attr_accessible :title
    has_many :list_bookmarks
    has_many :bookmarks, through: :list_bookmarks
end

class ListBookmark < ActiveRecord::Base
    attr_accessible :bookmark_id, :list_id
    belongs_to :list
    belongs_to :bookmark
end

class Bookmark < ActiveRecord::Base
    attr_accessible :title
    has_many :list_bookmarks
    has_many :lists, through: :list_bookmarks
end

答案 3 :(得分:1)

有两种型号Bookmark和List。

  1. 列表可以包含许多书签
  2. 书签可以包含多个列表
  3. 是多对多关系的案例。

    要解决这个问题,将会引入一个模型(ListBookMark)来解决多对多关系。

    ListBookmark属性:

    LIST_ID bookmark_id

    根据要求可能有更多属性。

    class List < ActiveRecord::Base
        attr_accessible :title
        has_many :list_bookmarks
        has_many :bookmarks, through: :list_bookmarks
    end
    
    class ListBookmark < ActiveRecord::Base
        attr_accessible :bookmark_id, :list_id
        belongs_to :list
        belongs_to :bookmark
    end
    
    class Bookmark < ActiveRecord::Base
        attr_accessible :title
        has_many :list_bookmarks
        has_many :lists, through: :list_bookmarks
    end
    

    我认为解决这个问题会有所帮助。

    阅读关系click here

    enter image description here