0

我有以下(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 %>

我不确定如何在他们俩上都使用该方法。

有什么建议么?

4

1 回答 1

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.
于 2012-12-02T10:23:06.303 回答