Не удается управлять ассоциациями в Ruby on Rails - PullRequest
0 голосов
/ 29 декабря 2010

У меня есть модель Post, которая используется для хранения контента, размещенного гостевыми пользователями, и этот контент управляется администратором.Администратор имеет право заблокировать или разблокировать конкретный пост.

Я хочу сделать следующее:

  1. Показать все разблокированные сообщения для гостевых пользователей.
  2. Показать все сообщения для администратора.

Для первого требования у меня есть модель BlockedPost, которая имеет полиморфную ассоциацию с моделью Post.Сообщение, которое будет заблокировано администратором, будет сохранено в модели BlockedPost.

Для второго требования я должен предоставить администратору право блокировать или разблокировать любой конкретный контент.Итак, в моем posts/index.html.erb я сделал это

<% @posts.each do |post| %>
  <% post.content %>
  <% if post.post_blocked? %>
    <td><%= link_to 'Unblock', blocked_post_path(content.id),:method => :delete%></td>
  <% else %>
    <td><%= link_to 'Block', create_blocked_post_path(content.id) %></td>
  <% end %>
<% end %>

Вышеуказанный метод post_blocked? определен в модели Post:

class Post < ActiveRecord::Base
  def post_blocked?
    !self.blocked_posts.nil?
  end
end

Это работает, но проблема возникает каждый раз, когдаpost_blocked? метод вызывается он делает вызов базы данных.

Есть ли способ остановить это поведение и получить статус всех сообщений в одном вызове базы данных?

1 Ответ

1 голос
/ 29 декабря 2010

хмм ... я думаю, вам следует немного изменить свои модели, потому что они немного неудобны и нет быстрого способа получить ваши сообщения из БД, удалить модель BlockedPost и добавить столбец в модель Post (в процессе миграции)t.boolean :blocked, :default => true Я бы сделал это так:

@blocked_posts = Post.where( :blocked => false)
@unblocked_posts = Post.where( :blocked => true )

или подготовил области в вашей модели Post, а затем, на ваш взгляд, просто отобразил 2 списка

<% @unblocked_posts.each do |upost| %>
  <%= upost.content %>
  <%= link_to 'Block that post', ... %>
<% end %>
<% @blocked_posts.each do |bpost| %>
  <%= bpost.content %>
  <%= link_to 'Unblock', ... %>
<% end %>
...