基本图书应用程序的Rails关联



我正在为不断增长的incel在线社区制作一个基本的应用程序,将他们与他们认为有用、有用和有指导意义的各种文献联系起来。我很难建立适当的联想。

我有几种型号:

  1. User:User.rb,一个模型的用户可以查看,评论和点赞书籍
  2. like:like.rb,like模型为书籍指定点赞
  3. comment:comment.rb,对书籍模型进行评论的评论模型(通过用户(
  4. book:book.rb,图书模型,将路由/查看pdf到主机服务器
  5. bookshares:bookshare.rb,将是一个连接表,将用户的点赞链接到书籍的评论等等,反之亦然
  6. godmodel:尚未实现以包罗万象的方式将所有内容连接在一起的假设模型

因此,我希望用户能够使用用户名创建,并能够在"网站"上查看、点赞和评论书籍,这些书籍最终将迁移到android应用程序。这是我糟糕透顶的代码:

class BookShare < ApplicationRecord

validates :book_id, presence: true, uniqueness: true
validates :viewer_id, presence: true, uniqueness: true 

belongs_to :user 
belongs_to :book
belongs_to :comment
end
class Book < ApplicationRecord
validates :title, presence: true 
validates :author, presence: true 
validates :user_id, presence: true 
validates :isbn, presence:  true 
validates :title, presence: true 
has_many :book_shares
has_many :users, through: :book_shares
has_many :likes, through: :book_shares
has_many :comments, through: :book_shares
end
class Comment < ApplicationRecord

validates :user_id, presence: true, uniqueness: true
validates :book_id, presence: true, uniqueness: true 
validates :title, presence: true 
has_many :book_shares
has_many :books, through: :book_shares

end 
class GodModel < ApplicationRecord
has_many :books 
has_many :users
has_many :comments 
#has_many :likes 
has_many :topics 
has_many :book_shares
end
class Like < ApplicationRecord
# not fully implemented yet. 
validates :user_id, presence: true 

belongs_to :user 
end
class User < ApplicationRecord
validates :username, presence: true, uniqueness: true
has_many :book_shares
has_many :comments, through: :book_shares
has_many :books, through: :book_shares
end
class Topic < ApplicationRecord
# not implemented yet 
end

这是我的模式:

ActiveRecord::Schema[7.0].define(version: 2022_04_12_145402) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
create_table "book_shares", force: :cascade do |t|
t.integer "book_id", null: false
t.integer "viewer_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["book_id", "viewer_id"], name: "index_book_shares_on_book_id_and_viewer_id", unique: true
t.index ["book_id"], name: "index_book_shares_on_book_id"
t.index ["viewer_id"], name: "index_book_shares_on_viewer_id"
end
create_table "books", force: :cascade do |t|
t.string "title", null: false
t.string "author", null: false
t.integer "user_id", null: false
t.text "body_info"
t.integer "isbn", null: false
t.binary "photo"
t.binary "r_data"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["user_id"], name: "index_books_on_user_id"
end
create_table "comments", force: :cascade do |t|
t.integer "user_id", null: false
t.integer "book_id", null: false
t.text "body_txt"
t.string "title"
t.binary "photo"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["book_id"], name: "index_comments_on_book_id"
t.index ["user_id"], name: "index_comments_on_user_id"
end
create_table "god_models", force: :cascade do |t|
t.string "title"
t.integer "user_id"
t.integer "comment_id"
t.integer "book_share_id"
t.integer "book_id"
t.integer "like"
t.integer "topic"
t.binary "data_x"
t.date "today"
t.binary "title2"
t.boolean "nullfy"
t.float "nums"
t.text "body"
t.datetime "create_at_"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["body"], name: "index_god_models_on_body"
t.index ["book_id"], name: "index_god_models_on_book_id"
t.index ["book_share_id"], name: "index_god_models_on_book_share_id"
t.index ["comment_id"], name: "index_god_models_on_comment_id"
t.index ["data_x"], name: "index_god_models_on_data_x"
t.index ["like"], name: "index_god_models_on_like"
t.index ["nullfy"], name: "index_god_models_on_nullfy"
t.index ["nums"], name: "index_god_models_on_nums"
t.index ["title2"], name: "index_god_models_on_title2"
t.index ["today"], name: "index_god_models_on_today"
t.index ["topic"], name: "index_god_models_on_topic"
t.index ["user_id"], name: "index_god_models_on_user_id"
end
create_table "likes", force: :cascade do |t|
t.integer "user_id"
t.string "likeable_type"
t.bigint "likeable_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["likeable_type", "likeable_id"], name: "index_likes_on_likeable"
t.index ["user_id", "likeable_type", "likeable_id"], name: "index_likes_on_user_id_and_likeable_type_and_likeable_id", unique: true
end
create_table "users", force: :cascade do |t|
t.string "username", null: false
t.string "email"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["username"], name: "index_users_on_username", unique: true
end
end

示例控制器:

class UsersController < ApplicationController

def index 
render plain: 'index' 
end
def show 
render plain: 'show'
end
def new 
render plain: 'new'
end
def destroy 
render plain: 'destroy'
end
def update 
redner update: 'update'
end
private 
def usershare_param 
params.require(:user).permit(:username)
end
end

这是我迄今为止制作的。我可以创建模型对象,保存它们并填充它们的字段,但我认为我的模型无法使用给定的关联。

我试过用erd,但它不起作用。在使用我的应用程序的情况下,模型/关联是否正确?我想要一个可以查看/评论/点赞感兴趣的书的用户。一本书可以有很多点赞和评论,许多用户可以查看书籍,用户可以点赞和评价许多书籍,稍后将实现主题来对书籍进行分类。通过用户点赞/评论/查看的整个机制将通过一个名为bookshares的联接表来实现。在进入迷你保护的视图/路线部分之前,我想正确地写下我的关联。

有4个表,booksuserscommentslikes。您可以实现给定的设计。

一本可以有很多喜欢者(用户(,一个用户也可以喜欢很多

书同样,一本书有很多评论,用户可以写很多评论。使comments成为用户和书籍之间的联接表,其中包含特定于注释的额外字段。

# app/models/book.rb
has_many :likes, dependent: :destroy 
has_many :comments, dependent: :destroy 
has_many :lovers, through: :likes, source: :user
has_many :commentors, through: :comments, source: :user
# app/models/user.rb
has_many :likes, dependent: :destroy
has_many :comments, dependent: :destroy
has_many :fav_books, through: :likes, source: :book
# app/models/like.rb
belongs_to :book
belongs_to :user 
# app/models/comment.rb
belongs_to :book 
belongs_to :user

您可以查阅本指南以更深入地探讨主题。

最新更新