簡體   English   中英

Rails:如何使一個模型“屬於”另一個模型?

[英]Rails: How to get one model to “belong” to another model?

我有一個模型“ votes”,它通過多態關聯屬於belonging_to兩個模型,並具有屬性user_id和comment_id。 以前,我有一個針對用戶的投票系統,該系統會在每次按下按鈕時為特定用戶創建新的投票:

<%= form_for [@user, @vote] do |f| %>
  <input type="hidden" id="user_id" name="user_id" value="#{@user.id}" />
  <%= f.submit ": )", :onclick => 'alert("Voted up!")' %>
<% end %>

@user.votes.count將返回按下按鈕的次數。 但是,我切換到另一種方法:

視圖:

<%= link_to "voteuser", vote_user_path(@user.id), method: :post, :class => "btn btn-small" %>

控制器:

def vote
  @user = User.find(params[:id])
  Vote.create!(user_id: @user.id)
  redirect_to @user
end

路線:

Website::Application.routes.draw do

  root 'home_page#home'
  get "votes/new"
  get 'users/random'
  post 'users/vote/:id' => 'users#vote', as: 'vote_user'
  get 'users/users/random' => 'users#random'
  resources :users
  get "all/allusers"
  get "all/users/new" => 'users#new'
  get 'all/all/allusers' => 'all#allusers'

end

並且仍創建一個表決,其user_id等於當前的User.id,但現在@user.votes.count返回0,因此應用程序未注冊該投票屬於該用戶。 我該如何補救?

投票模型:

class Vote < ActiveRecord::Base
  belongs_to :voteable, polymorphic: true
end

投票架構:

create_table "votes", force: true do |t|
  t.integer  "thing_id"
  t.integer  "comment_id"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.integer  "voteable_id"
  t.string   "voteable_type"
end

用戶模型:

class User < ActiveRecord::Base
  has_many :votes, as: :voteable
end

用戶架構:

create_table "users", force: true do |t|
  t.string   "name"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.string   "avatar_file_name"
  t.string   "avatar_content_type"
  t.integer  "avatar_file_size"
  t.datetime "avatar_updated_at"
end

對用戶來說應該是Vote.create!(voteable_id: params[:id], voteable_type: 'User')或簡稱為Vote.create!(vote: User.find(params[:id])) # Vote.create!(vote: Comment.find(params[:id]))

檢查是否在控制器中檢索到用戶標識,並且可以在視圖中查看

<%= form_for [@user, @vote] do |f| %>
  <%= f.hidden_field :user_id, value: f.model.user.id %>
  <%= f.submit ": )", :onclick => 'alert("Voted up!")' %>
<% end %>

在您的控制器上,您可以簡單地執行以下操作:

def vote
  Vote.create!(user_id: params[:id])
  redirect_to @user
end

但是您使用多態關聯,因此必須指定user_id和user_type。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM