我似乎无法绕过这个。我有三张桌子:
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
我无法想象的是一种干净方式将两者结合起来并得到用户创建的消息列表并提到了。任何想法?
答案 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])