2015-11-15 102 views
0

我正在设置一个Ruby on Rails应用程序,其中用户将拥有一个Album集合。我最初的想法是设置一个简单的用户has_many专辑和专辑属于用户。这里出现的问题是相册表将具有重复条目,只能通过user_id进行区分。活动记录关联以防止重复数据库条目

id | album_name | artist_id |   created_at   |   updated_at   | user_id 
-----+-------------+-----------+----------------------------+----------------------------+--------- 
    2 | SuperRando | 3  | 2015-11-13 00:03:51.790759 | 2015-11-13 00:03:51.790759 | 1  
    3 | SuperRando | 3  | 2015-11-13 00:19:08.438907 | 2015-11-13 00:19:08.438907 | 2  

那么最好的行动方案是什么,所以我可以有一个专辑表与所有独特的专辑?

回答

3

你可以使用一个连接表模型,可以:

class Album < ActiveRecord::Base 
    has_many :user_albums 
    has_many :users, through: :user_albums 
end 

class User < ActiveRecord::Base 
    has_many :user_albums 
    has_many :albums, through: :user_albums 
end 

class UserAlbum < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :album 
end 

所以,你的模式想有点像这样的:你会调用这段代码在你的控制器的方式

create_table "albums", force: :cascade do |t| 
    t.string "name" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    create_table "user_albums", force: :cascade do |t| 
    t.integer "user_id" 
    t.integer "album_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    create_table "users", force: :cascade do |t| 
    t.string "email" 
    t.string "first_name" 
    t.string "last_name" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

现在,或安慰。通过user.save

现在album = Album.find_or_create_by(params)

  • 与专辑副用户user.albums << album &然后将其保存到看到用户的:你可以这样做:

    1. 创建用户:user = User.create(params)
    2. 查找或创建一个相册专辑。你可以这样做: User.take.albums

      看到一个特定专辑的用户,你可以做 Album.take.users

      希望这回答了你的问题。

      欲了解更多信息看看导轨指南: http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association