【问题标题】:Rails: How to get one model to "belong" to another model?Rails:如何让一个模型“属于”另一个模型?
【发布时间】:2014-11-02 20:40:33
【问题描述】:

我有一个模型“投票”,它通过多态关联属于两个模型,并具有属性 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

【问题讨论】:

  • 应该是@user.votes.count
  • @Kimooz 哦,对了,很好。 user.votes.count 在我的代码中是这样的。
  • 请确保您的路线行在users 资源之前,如果有的话,在post 'users/:id' 之前...如果没有,那么它将尝试发布给用户id:vote...
  • 我认为您缺少voteable_type,请显示您的投票架构。
  • 请注意,您不需要comment_idthing_id。因为如果你只存储对象的投票,它们可以保存在可投票的多态列中。

标签: ruby-on-rails ruby ruby-on-rails-4 associations polymorphic-associations


【解决方案1】:

对于用户来说应该是Vote.create!(voteable_id: params[:id], voteable_type: 'User'),或者简而言之 Vote.create!(vote: User.find(params[:id])) # Vote.create!(vote: Comment.find(params[:id]))

【讨论】:

  • 哈希键不应该是:voteable,就像Vote.create!(voteable: User.find(params[:id]))一样
【解决方案2】:

检查您是否在控制器中检索用户 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多