匹配用户Ruby on Rails和ActiveRecord

时间:2016-06-12 19:12:07

标签: ruby-on-rails ruby activerecord matching

[问题解决] =>我犯了一个愚蠢的错误,忘记在我的方法结束时添加@ match.save:)

我对RoR和ActiveRecord架构相对较新。我正在尝试构建一个简单的应用程序,可以根据用户的兴趣将两个用户匹配在一起。首先是我的数据库架构:

Link to my DB's schema

或者您更喜欢这里的schema.rb文件:

  ActiveRecord::Schema.define(version: 20160612080318) do




 create_table "conversations", force: :cascade do |t|
    t.integer  "user1_id"
    t.integer  "user2_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  add_index "conversations", ["user1_id"], name: "index_conversations_on_user1_id", using: :btree
  add_index "conversations", ["user2_id"], name: "index_conversations_on_user2_id", using: :btree

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

  create_table "matches", force: :cascade do |t|
    t.integer  "user1_id"
    t.integer  "user2_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  add_index "matches", ["user1_id"], name: "index_matches_on_user1_id", using: :btree
  add_index "matches", ["user2_id"], name: "index_matches_on_user2_id", using: :btree

  create_table "messages", force: :cascade do |t|
    t.text     "content"
    t.integer  "conversation_id"
    t.integer  "user_id"
    t.datetime "read_at"
    t.datetime "created_at",      null: false
    t.datetime "updated_at",      null: false
  end

  add_index "messages", ["conversation_id"], name: "index_messages_on_conversation_id", using: :btree
  add_index "messages", ["user_id"], name: "index_messages_on_user_id", using: :btree

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

  create_table "users", force: :cascade do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.inet     "current_sign_in_ip"
    t.inet     "last_sign_in_ip"
    t.datetime "created_at",                          null: false
    t.datetime "updated_at",                          null: false
    t.string   "first_name"
    t.string   "last_name"
    t.integer  "age"
    t.string   "avatar_url"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
  add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree

  add_foreign_key "messages", "conversations"
  add_foreign_key "messages", "users"
  add_foreign_key "user_interests", "interests"
  add_foreign_key "user_interests", "users"
end

为了测试我的模型,我没有考虑根据用户兴趣匹配用户的算法。所以这是我的matches_controller.rb:

class MatchesController < ApplicationController

  def new
    @match = Match.new
  end

  def create
    @match = Match.new(match_params)
    @match.user1_id = current_user.id
    @match.user2_id = User.first.id 
  end


  private

  def match_params
    params.require(:match).permit(:user1_id, :user2_id)
  end
end

我的比赛模特:

class Match < ActiveRecord::Base
    belongs_to :user1, class_name: "User"
    belongs_to :user2, class_name: "User"

end

最后是我的用户模型:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_many :user_interests, dependent: :destroy
  has_many :interests, through: :user_interests, dependent: :destroy
  has_many :messages, dependent: :destroy
  has_many :matches, dependent: :destroy

  def conversations
    Conversation.includes(:messages)
                .where("user1_id = :id OR user2_id = :id", id: id)
                .order("messages.created_at DESC")
  end

  def other_user(conversation)
    conversation.users.include?(self) ? conversation.other_user(self) : nil
  end

  def unread_conversations
    conversations.select { |c| c.unread_messages?(self) }
  end

  def unread_conversations_count
    unread_conversations.count
  end

  def unread_conversations?
    unread_conversations_count > 0
  end

  def one_avatar_url
    avatar_url ? avatar_url : "http://placehold.it/64x64"
  end
end

我试图在控制台中测试我的Match.create方法,但对于user1_id和user2_id只有nil。我一直在寻找一整天,而无法确定我的代码有什么问题。

非常感谢帮助我解决这个问题:)

0 个答案:

没有答案