2012-06-17 3 views
0

Я использую Rails 3 и Придумайте 2.0Использование Завещание, чтобы проверить ресурс против CURRENT_USER

В индексном ресурса сообщений, я хочу, чтобы отобразить кнопку голосов, если current_user не уже проголосовали.

Я только перехожу в @posts = Post.all в индексный вид. Каков наилучший способ проверить каждое сообщение, чтобы увидеть, действительно ли current_user уже голосовал и отображает представление соответственно?

В настоящее время я пытаюсь сделать это с помощью метода voted? в моей модели Post, но метод current_user недоступен.

Другое решение, которое я вижу, должно иметь if letter.votes.find_by_user_id(current_user.id) в представлении индекса, но я не уверен, что это принадлежит логике вида.

ответ

1

У вас есть Post, Vote и User модель

И вы хотите знать, когда пост имеет голос от конкретного пользователя

Одним из путей сделать это может быть метод Джастина, но это будет производить слишком много запросов к базе данных, чем требуется

Лучшим решением было бы использовать has_many :through ассоциацию, как это:

class Post 
    has_many :votes 
    has_many :voted_users, through: :votes, source: :user 
end 

И теперь вы можете позвонить @posts = Post.includes(:voted_users)

Это нетерпеливые нагрузки всех пользователи, проголосовавшие на каждом пост

И вы могли бы просто сказать

if post.voted_users.include? current_user 
    #do stuff 
end 
+0

Хмм, никогда не пробовал это раньше, но это похоже на лучший способ сделать это. Попробуем. Благодаря! – mehulkar

+0

попробовал это, и он работал красиво. Спасибо, Андрей – mehulkar

3

Хорошим решением было бы реализовать метод в вашей Post модели или помощника следующим образом (предполагается, что после HAS_MANY голосов):

def voted?(user) 
    !votes.find_by_user_id(user.id).empty? 
end 

Затем, по вашему мнению, вы можете поместить if post.voted?(current_user)

You правильны, логика принадлежит модели, и модель не имеет никаких знаний (и не должна) ничего вне модели, например текущего пользователя. Вы должны передать его в качестве аргумента

+0

тьфу, это кажется настолько очевидным в ретроспективе. Спасибо Джастину. – mehulkar

+0

Рад помочь. Я просто сделал небольшое изменение, поскольку, по соглашению, методы заканчиваются? должен возвращать логическое значение. – Justin

Смежные вопросы