我正在使用播放框架创建一个简单的博客Web应用程序,其中有某些类别,用户可以发布到他们想要的类别,但问题是,当我发布到一个类别时,帖子也会发布到所有类别
Application code:
import java.util.*;
import models.*;
public class Application extends Controller {
public static void index() {
List Posts = Post.find ("order by type desc").fetch();
render(Posts);
}
public static void addpost (String content) {
Post post = new Post(content).save();
renderJSON(content);
html code:
<h2>
CollabBlog
</h2>
#{extends 'main.html' /}
#{set title:'Home' /}
<head>
<title>#{get 'title' /}</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<link rel="stylesheet" type="text/css" media="screen"
href="@{'/public/stylesheets/categories.css'}" />
</head>
<h3>Category: Health</h3>
#{ifnot Posts}
No posts to view
#{/ifnot}
<ul>
#{list items:Posts, as: 'Post'}
<li>
<p>${Post.poster}</p><p>${Post.content}</p>
</li>
#{/list}
</ul>
<p>
<a id="addpost" href="#">add new Health's post</a>
</p>
<h3>Category: Politics</h3>
#{ifnot Posts}
No posts to view
#{/ifnot}
<ul>
#{list items:Posts, as: 'Post'}
<li>
<p>${Post.poster}:</p><p>${Post.content}</p>
</li>
#{/list}
</ul>
<p>
<a id="addpost" href="#">add new Politic's post</a>
</p>
<h3>Category: Entertainment</h3>
#{ifnot Posts}
No posts to view
#{/ifnot}
<ul>
#{list items:Posts, as: 'Post'}
<li>
<p>${Post.poster}</p><p>${Post.content}</p>
</li>
#{/list}
</ul>
<p>
<a id="addpost" href="#">add new Entertainment's post</a>
</p>
<body>
<link href="index.css" rel="stylesheet" type="text/css">
</body>
<script type="text/javascript" charset="utf-8">
$('#addpost').click(function() {
$.post('@{addpost()}', {content: prompt('post content ?')}, function(Post){
$('ul').prepend()
})
$.post('@{addpost()}', {poster : prompt('which category ?')}, function(Post){
$('ul').prepend()
})
})
</script>
}
}
有谁知道如何解决这个问题?
答案 0 :(得分:1)
在阅读了您的其他评论后(希望我没有误解),您可以在控制器中执行的操作是在type
列中找到所有唯一类别。然后对于每种类型(由下面的代码段中的categories
变量表示),您可以进行此调用:
Map<String, List<Post>> map = new HashMap<String, List<Post>>();
// the categories variable here is the unique types from the Post table
for (String category : categories) {
List<Post> posts = Post.find("type = ?", category).fetch();
map.put(category, posts);
}
render(map);
然后在您的视图中,您可以查看将代表所有类别名称的地图键,然后获取与该键相关联的值并迭代该类别的帖子。
以上假设用户可以输入他们想要的任何内容。如果您真的希望他们根据原始帖子中的视图示例选择健康,政治和娱乐,那么您可能需要在数据库中对类别进行建模。一些选项可能是:
第一个选项
您可以拥有两个实体:(1)发布和(2)类别。你有第一个。你需要创建的第二个。因此,创建一个这样的类别实体:
@Entity
public class Category extends Model {
@OneToMany(mappedBy = "category", targetEntity = Post.class)
public List<Post> posts;
...
}
然后在你的Post实体中,你可以在Post和Category实体之间建立关系:
@Entity
public class Post extends Model {
@ManyToOne
@JoinColumn(name = "category_id")
public Category category;
...
}
如果用户(或您)可以动态(或直接在数据库中)创建类别以允许用户选择预定义的类别,那将是很好的。
第二个选项
如果上面的例子是过度的,因为类别只是一个单词,并且没有其他属性,如描述,那么你可以只使用枚举类别:
public class Post extends Model {
@Enumerated(EnumType.STRING)
public Category category;
...
}
其中类别是这样的枚举:
public enum Category {
HEALTH,
ENTERTAINMENT,
POLITICS
}
此选项再次表示用户将从预定义列表中进行选择。