Есть ли отношения activerecord для решения этой проблемы? - PullRequest
0 голосов
/ 11 марта 2011

Я не могу обернуться вокруг этого. У меня есть три таблицы:

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

То, что я не могу понять, это чистый способ объединить два и получить список сообщений, в которых пользователь создал И был упомянут. Любые идеи?

1 Ответ

2 голосов
/ 11 марта 2011

В вашей пользовательской модели эта строка должна присутствовать для полиморфных отношений.

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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...