我有以下内容(Vote
作为与Post
的多态关联):
votes_controller.rb:
if already_voted?
@vote = @votable.votes.find_by_user_id(current_user.id)
@vote.destroy
end
帖/ _vote_form.html.erb:
<div class="vote-form">
<% if @post.votes.exists?(:user_id => current_user.id) %>
<% if @post.votes.find_by_user_id(current_user.id).polarity == 1 %>
<%= form_for ([@post, @post.votes.find_by_user_id(current_user.id)]),
method: :delete,
remote: true do |f| %>
(etc).
我想在后视图和投票控制器中替换votes.find_by_user_id(current_user.id)
,如下所示:
def vote_by_current_user
self.votes.find_by_user_id(current_user.id)
end
所以他们变得更加可以这样:>
@vote = @votable.vote_by_current_user
或<% if @post.vote_by_current_user.polarity == 1 %>
我不确定如何在这两种方法上使用该方法。
有什么建议吗?
答案 0 :(得分:1)
一件事:你不应该在你的模型中做任何与会话相关的事情(它打破了MVC模式),所以你已经以正确的方式做了。
你可以采取哪些措施来改善这种情况:从current_user
开始。
class User < ActiveRecord::Base
def self.polarized_vote_for( votable, polarity = 1 )
votes.where( polarity: polarity ).find_by_votable_id( votable.id )
end
只记得存储调用返回的关系以避免多次查询:
<% if vote = current_user.polarized_vote_for( @post ) %>
<%= form_for [@post, vote] do |f| %>
# etc.