按名称查找关联

时间:2014-10-04 00:13:24

标签: ruby-on-rails associations

我有一个拥有很多朋友的用户模型。我希望能够通过名字找到用户的所有朋友。

我希望能够在用户名中找到所有用户名为“john”的用户。

用户

id   |           email           |         created_at         |         updated_at         |                       password_digest                        |     remember_token     | admin |   username    | password_reset_token | password_reset_sent_at | provider | uid | generated_password
-------+---------------------------+----------------------------+----------------------------+--------------------------------------------------------------+------------------------+-------+---------------+----------------------+------------------------+----------+-----+--------------------
 27288 | ******@hotmail.com | 2014-02-19 17:25:22.545866 | 2014-02-19 17:25:22.545866 | $2a$10$hjdAPWYTorCN7NW6QawmtOMqTk.DP8m2e.I9XjfujRG8em8eq6z9G | dxowM5tTTalNLWSO_5j8sw | f     | huntingtonl93 |                      |                        |          |     | f
    23 | *******@gmail.com             | 2013-07-05 17:18:59.64622  | 2013-07-05 17:18:59.64622  | $2a$10$4D0cML22vnVYuT0tJTJwMO/T4xuiGYUU70BnK1ug3K.TE1.pWG64e | FS2aVM57bX0ZiMBNuWnxLA | f     | one           |                      |                        |          |     | f
    31 | ********@gmail.com       | 2013-09-06 21:47:52.869246 | 2013-09-06 21:47:52.869246 | $2a$10$XW6jPGZTiYo6KZm4WWOBye0b.mpNuKGt89gMLVRCjF7kjuhzHXzJG | TUsweMN36i_eouveEFU9cQ | f     | drebenok      |                      |                        |          |     | f
  6388 | *******@startupv8.com        | 2013-11-25 00:20:44.124276 | 2013-11-25 00:20:44.124276 | $2a$10$O5V/8C2vs.CpkYDDwByjiOOVkf0FlWb8lsMVX/r8cPnHbL8G0gRda | 2duwh0WURFI10I1PcBnD9Q | f     | ihab

id | user_id | user_id_friend |         created_at         |         updated_at
----+---------+----------------+----------------------------+----------------------------
 10 |      15 |             23 | 2013-08-13 01:55:41.406368 | 2013-08-13 01:55:41.406368
 12 |      15 |             28 | 2013-08-13 01:55:57.025223 | 2013-08-13 01:55:57.025223
 14 |      16 |             23 | 2013-08-13 01:57:35.910647 | 2013-08-13 01:57:35.910647
 16 |      17 |             23 | 2013-08-13 01:58:01.051038 | 2013-08-13 01:58:01.051038
 18 |      17 |             24 | 2013-08-13 01:58:08.866769 | 2013-08-13 01:58:08.866769

2 个答案:

答案 0 :(得分:1)

你可以很容易地用gem" Ransack"来做。它允许您轻松执行这样的搜索。

https://github.com/activerecord-hackery/ransack

答案 1 :(得分:1)

您可以通过向关联添加条件来执行此操作,如下所示:

user.friends.where("username like ?", '%john%')

这只涉及一点SQL知识。我们希望用户名与我们提供的字符串“相似”。字符串本身('%john%')将匹配任何内部包含“john”的用户名。 “%”是一个通配符,它​​将匹配“john”之前或之后可能出现的任何字符。

如果您只想找到用户名开头的用户,您可以这样做:

user.friends.where("username like ?", "john%")

如果您只想查找用户名结束的用户,请执行以下操作:

user.friends.where("username like ?", "%john")

此方法可应用于在ActiveRecord中搜索时使用的任何条件。例如,您可以找到所有没有电子邮件地址的用户朋友:

user.friends.where(email: nil)

我希望这有帮助!