优化模型设置,供用户查找帖子

时间:2014-04-26 16:18:32

标签: ruby-on-rails model relationship

我有一个带有以下关系的rails 4.1应用程序:

  • 用户has_many博客,博客属于用户
  • 用户has_many通过博客发布帖子
  • 帖子belongs_to blog
  • 博客has_many帖子

这种关系允许我做类似的事情:

@user = User.create(name: 'Sally') 
@blog = @user.blogs.create(title: 'New Blog')
@blog.posts.create(title: 'New Post', content: 'Hello World')

如果你追溯到这一点,你会看到莎莉创建了一个博客,名为新博客,其中一篇帖子称为新帖。

你怎么能说邀请George加入博客作为客座作者,所以我们假设你有一种将用户添加到博客的方法:

@user_george = User.create(name: 'George')
@blog.add_user(@user_george.id)

很好,所以现在乔治可以发布一个博客:

@user_george.blogs.find_by_id(@blog.id).posts.create(title: 'Georges Post', content: 'Some content')

现在我们可以搜索georges帖子和sallies帖子。这是我遇到问题的地方,如果你只给了json返回的博客对象怎么办?到目前为止,这个博客有两个用户,两个帖子。查找帖子的当前方式(在模型级别)直接通过用户模型:

User.find_by_id(x).posts.all()

我发现有几个问题。一个乔治不能添加到博客,因为一个特定的博客属于一个用户(我假设用户有很多并且通过联接表属于博客blogs_users会解决这个问题吗?)另外我怎么想知道是谁写了什么帖子为什么博客假设这是作为API给你的?所以,让我们说莎莉想用这个来在她的网站上显示她的帖子和乔治的客座帖子......

1 个答案:

答案 0 :(得分:0)

1-乔治无法添加到博客,因为特定博客属于用户

一种方法是定义两种类型的关联,引用User中的Blog模型,如:

class Blog < ActiveRecord::Base
  has_one :owner, class_name: "user", foreign_key: :owner_id
  has_many :users
end

这样,许多用户可能属于博客,而它只有一个所有者。

2-我怎么想知道是谁为什么博客写了什么帖子

您当前的设置确实支持:

@user.posts.includes(:blog)
#should give you all posts for user George along with blog details for each post

3-如何构建优化设计? (我的意见)

我学到了(艰难的方法)在设计方面做出最佳解决方案,从一开始就试图让它变得完美!开始尝试您的想法并进行小的更改,您将逐步达到最佳解决方案。

我想说的是,“不要过度思考”,因为在你玩它之前,你永远不会想到什么是错的。