我应该使用哪种Active记录关联

时间:2018-01-19 16:03:19

标签: ruby-on-rails-5

我使用的是rails 5.1.4,所以我在我的所有用户中都有一个表USER,然后用户可以向其他用户发送好友请求,我想将该请求存储到名为FRIEND的其他表中,例如user_1(发送请求的人) - user_2(被请求者),但您将了解这两个用户(user_1,user_2)来自USER表。

这意味着:首先我有这个表包含所有用户的用户。我想说的是,此表用户中的任何用户都可以与同一个表用户中的任何其他用户成为朋友。

1 个答案:

答案 0 :(得分:0)

我不是100%肯定你在问题中提出的要求,但听起来你要做的就是拥有一张名为“用户”的表和另一张名为“朋友”的表,以便能够存储一个朋友请求的值。我相信你想要研究的是" has_many:通过协会"使用"连接表"。观看此视频,它会引导您完成http://blog.teamtreehouse.com/what-is-a-has_many-through-association-in-ruby-on-rails-treehouse-quick-tip

这里有关于Active Record关联http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

的更多信息

修改 根据您的下面的帖子,您想要做的只是一个简单的has_many关联。在您的用户模型中添加has_many :friends, dependent: :destroy并在您的好友模型中添加belongs_to :users现在转到您的路线文件并通过执行将朋友作为用户的嵌套路线

  # nested routes for users
  resources :users do
    resources :friends
  end
在您的朋友表中

确保您为迁移中的用户添加了一个外键t.references :user, foreign_key: true

现在在您的friends_controller中,您需要更新这样的操作。替换示例"专利"和你的朋友"对象

class PatentsController < ApplicationController

  # first loads @user and then @patent for the below actions.
  before_action :set_user, only: [:index, :show, :new, :edit, :create, :update]
  before_action :set_patent, only: [:show, :edit, :update, :destroy]

  # GET /patents
  # GET /patents.json
  def index
    @patents = @user.patents
  end

  # GET /patents/1
  # GET /patents/1.json
  def show
  end

  # GET /patents/new
  def new
    @patent = @user.patents.new
  end

  # GET /patents/1/edit
  def edit
  end

  # POST /patents
  # POST /patents.json
  def create
    @patent = @user.patents.new(patent_params)

    respond_to do |format|
      if @patent.save
        format.html { redirect_to user_patents_path(@patent.user), notice: 'Patent was successfully created.' }
        format.json { render :show, status: :created, location: @patent }
      else
        format.html { render :new }
        format.json { render json: @patent.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /patents/1
  # PATCH/PUT /patents/1.json
  def update
    respond_to do |format|
      if @patent.update(patent_params)
        format.html { redirect_to user_patents_path(@patent.user), notice: 'Patent was successfully updated.' }
        format.json { render :show, status: :ok, location: @patent }
      else
        format.html { render :edit }
        format.json { render json: @patent.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /patents/1
  # DELETE /patents/1.json
  def destroy
    @patent.destroy
    respond_to do |format|
      format.html { redirect_to user_url(@user), notice: 'Patent was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  #######################
  # private methods
  #######################
  private

    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:user_id])
    end

    def set_patent
      @patent = Patent.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def patent_params
      params.require(:patent).permit(:patent_title, :patent_office, :patent_number, :patent_status, :patent_date, :patent_description, :user_id)
    end
end