活动记录关联以防止重复的数据库条目

时间:2015-11-15 14:36:58

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

我正在设置一个Ruby on Rails应用程序,其中User将拥有一个Album集合。我最初的想法是设置一个简单的用户has_many专辑和专辑属于用户。这里出现的问题是Album表将有重复条目,仅由user_id区分。

header.php

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

1 个答案:

答案 0 :(得分: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

现在,您可以在控制器或控制台中调用此代码。你可以这样做:

  1. 创建用户:user = User.create(params)
  2. 查找或创建相册:album = Album.find_or_create_by(params)
  3. 将用户与该相册user.albums << album&amp;然后按user.save
  4. 保存

    现在查看用户的相册。你可以做: User.take.albums

    要查看特定相册的用户,您可以这样做 Album.take.users

    希望这能回答你的问题。

    有关更多信息,请查看导轨指南: http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association