是否有一个积极的记录关系来解决这个问题?

时间:2011-03-11 02:18:25

标签: ruby-on-rails activerecord

我似乎无法绕过这个。我有三张桌子:

mysql> desc users;
+----------------------+--------------+------+-----+---------+----------------+
| Field                | Type         | Null | Key | Default | Extra          |
+----------------------+--------------+------+-----+---------+----------------+
| id                   | int(11)      | NO   | PRI | NULL    | auto_increment |
| username             | varchar(255) | YES  |     | NULL    |                |
+----------------------+--------------+------+-----+---------+----------------+

mysql> desc mentions;
+------------------+--------------+------+-----+---------+----------------+
| Field            | Type         | Null | Key | Default | Extra          |
+------------------+--------------+------+-----+---------+----------------+
| id               | int(11)      | NO   | PRI | NULL    | auto_increment |
| message_id       | int(11)      | YES  |     | NULL    |                |
| mentionable_type | varchar(255) | YES  |     | NULL    |                |
| mentionable_id   | int(11)      | YES  |     | NULL    |                |
+------------------+--------------+------+-----+---------+----------------+

mysql> desc messages;
+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| id         | int(11)  | NO   | PRI | NULL    | auto_increment |
| body       | text     | YES  |     | NULL    |                |
| user_id    | int(11)  | YES  |     | NULL    |                |
+------------+----------+------+-----+---------+----------------+

以下关系:

class User < ActiveRecord::Base
  has_many :messages
end

class Message < ActiveRecord::Base
  belongs_to :user
  has_many :mentions
end

class Mention < ActiveRecord::Base
  belongs_to :mentionable, :polymorphic => true
  belongs_to :message
end

我不确定我是否正确使用它,但我在提及中使用了多态关系,因为提及的类型可能是'用户'或'组'。我已经离开了这篇文章,因为它与这个问题无关。

当用户创建消息时,他们的user_id存储在消息表中。我可以使用以下命令轻松返回用户“创作”消息的列表:

current_user.messages

与推文类似,邮件的正文可能包含也可能不包含n个用户或组的提及。当消息“我和@userA,@ userB和@groupX共进午餐时”。创建后,将对主体进行解析,并创建三个“提及”。

我可以轻松地返回所有用户的“提及”:

current_user.mentions

如果我想看到提及的信息,我可以这样做:

mention = current_user.mentions.first
mention.message

我无法想象的是一种干净方式将两者结合起来并得到用户创建的消息列表并提到了。任何想法?

1 个答案:

答案 0 :(得分:2)

我是你的用户模型,这条线应该出现在多态关系中。

class User
  has_many :messages
  has_many :mentions, :as => :mentionable
end

试试这个:

user_id = 10
@messages = Message.find(:all, :joins => [:mentions], 
                         :conditions => ['messages.user_id = ?', user_id])