Я не могу обернуться вокруг этого. У меня есть три таблицы:
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
Я не уверен, правильно ли я это использую, но я использовал полиморфные отношения в Mention, потому что упоминать_тип может быть «Пользователь» или «Группа». Я оставил материал группы из этого поста, поскольку он не связан с этим вопросом.
Когда пользователь создает сообщение, его user_id сохраняется в таблице сообщений. Я могу легко вернуть список "созданных" сообщений пользователя с помощью:
current_user.messages
Подобно твиту, тело сообщения может содержать или не содержать упоминания о n пользователях или группах. Когда появляется сообщение «Я обедаю с @userA, @userB и @groupX». будет создан, тело будет проанализировано, и эти три "упоминания" также будут созданы.
Я могу легко вернуть все "упоминания" пользователя с помощью:
current_user.mentions
Если я хочу увидеть сообщение об упоминании, я могу сделать:
mention = current_user.mentions.first
mention.message
То, что я не могу понять, это чистый способ объединить два и получить список сообщений, в которых пользователь создал И был упомянут. Любые идеи?