has_many :通过但只是有时?

has_many :through but only sometimes?

我有一个包含很多 Users 的应用程序,其中每个 User 有很多 Questions

为什么我需要这样做

现在,我们希望能够将一些 Messages 舀到 Questions 中。这很复杂,因为并非所有 Messages 都属于 Question。这是一个例子:

- = Not (really) a question
x = Belongs to question x
y = Belongs to question y

[-] Hey
[-] Hey, what's up?
[x] Not much. Hey, what's a good movie to see tonight?
[x] How about Star Wars?
[x] Great idea! Thanks.
[-] You bet.
[-] Star wars is awesome.
[-] Yeah it is.
[-] Hey I have another question
[-] Shoot
[y] Where should I go on vacation this summer?
[y] Go to France, it's beautiful.
[y] Yeah, I'll go to France.
[-] Any other questions?
[-] No, but thanks for your help.

需要发生什么

作为最终结果,我希望看到消息流并标记属于问题的消息,如上所述。所以做一些像

这样的事情会很好
@messages.each do |message|
  if not message.question.blank?
    ...

并且我想标出问题的类别(Question的属性)

@message.question.update(category: 3)

我还想查看单个问题并对其应用类别,这样我就可以提取如下内容:

p = @question.category
ul
  @question.messages.each do |message|
    li = message.content

我担心的是消息并不总是与问题相关。那么我应该如何构建我的数据?

更新

还有一点忘了说,数据最终应该输出为JSON。

基本上你想做的是在 Message 中创建一些方法来处理整个 if question.present? 检查,例如

class Message < ActiveRecord::Base
  belongs_to :question

  def category
    question.try(:category) || "-"
  end

  # ...
end

那么你可以在你看来做这样的事情:

@messages.each do |m|
  = "[#{m.category}] #{m.text}"