0

ユーザーと通知の2つのモデルがあります。

User has_many :notifications
Notification belongs_to User

これは通知の記述コードです

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_id    | int(11)      | YES  |     | NULL    |                |
| namespace  | varchar(255) | YES  |     | NULL    |                |
| key        | varchar(255) | YES  |     | NULL    |                |
| value      | tinyint(1)   | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

通知の例は次のとおりです。

+----+---------+-----------+-----------------+-------+
| id | user_id | namespace | key             | value |
+----+---------+-----------+-----------------+-------+
|  4 |      -1 | facebook  | launch_campaign |     1 |
|  5 |      -1 | facebook  | add_video       |     1 |
|  6 |      -1 | facebook  | add_image       |     1 |
|  7 |      -1 | twitter   | add_image       |     1 |
|  8 |      -1 | twitter   | add_video       |     1 |
|  9 |      -1 | twitter   | launch_campaign |     1 |
|  10|      21 | facebook  | add_video       |     0 |
|  11|      1  | facebook  | add_image       |     0 |
|  12|      10 | twitter   | add_image       |     0 |
|  13|      12 | twitter   | add_video       |     0 |
+----+---------+-----------+-----------------+-------+

user_id = -1の行がデフォルト値であり、ユーザーがデフォルト値を上書きするたびに、そのユーザーの行と名前名とアクション、および上書きされた値を追加します。

今私がするなら私はレールします

User.notifications

user_idを含む通知のみを取得しますが、ユーザーが上書きしていないデフォルトの通知(use_id = -1)も取得したいと思います。それを行う方法はありますか?また、このデザイン/トピックに関するアドバイスをいただければ幸いです:)!

これは私のデザインデータベース+データモデルデザインパターンのより詳細な説明でもあり ます

4

2 に答える 2

1

has_many関係を直接使用する代わりに、Userクラスでスコープを試してください。このようなもの:

scope :all_notifications, joins("left join notifications n on n.user_id=users.id").where(["n.user_id=? OR n.user_id=?", self.id, -1])
于 2012-07-04T03:59:46.550 に答える
1

私はあなたが:conditionsあなたの協会のためにオプションを使うことを試みることができると思います:

has_many :notifications, :conditions => 'user_id = #{id} OR user_id = -1'

注:これは補間文字列ではなく、クラスではなくオブジェクトのコンテキストで補間されます。

アップデート。

または、:finder_sql十分に良いでしょう。とにかく、ここには面白い生活がたくさんあります。

于 2012-07-04T15:30:30.370 に答える