1

Ruby onRails3.2.9とMySQLを使用しています。属性を持つArticleモデルがありuser_id(この属性は外部キーを表します---id関連付けられた著者ユーザー用)、特定の著者の「のために」それらを注文する記事を取得したいと思います。つまり、次のレコードがあると仮定します。

<#Article id: 1, title: "Title 1", user_id: 1>
<#Article id: 2, title: "Title 2", user_id: 2>
<#Article id: 3, title: "Title 3", user_id: 1>
<#Article id: 4, title: "Title 4", user_id: 3>
<#Article id: 5, title: "Title 5", user_id: 1>
...
<#Article id: N, title: "Title N", user_id: M>

id 1著者のために( )で注文された記事を探す場合user_id = 1、返される記事は次のように注文する必要があります。

<#Article id: 1, title: "Title 1", user_id: 1>
<#Article id: 3, title: "Title 3", user_id: 1>
<#Article id: 5, title: "Title 5", user_id: 1>
<#Article id: 2, title: "Title 2", user_id: 2>
<#Article id: 4, title: "Title 4", user_id: 3>
...
<#Article id: N, title: "Title N", user_id: M>

言い換えれば、私はすべての記事を取得しようとしていますが、この「優先度」で注文されたものを作成します。特定の著者によって作成された記事が最初に返され、次に他のすべての記事が返されます(つまり、与えられた著者)。

どうすればそれを作ることができますか?


:おそらくメソッドを介して、RubyonRailsの実装を探していorderます。

4

4 に答える 4

2

user_id 1を検索していて、user_idによる通常の順序付けではとにかくそれらが最初になるため、例はそれほど明確ではありません。私はあなたが次のようなことをするつもりだと信じています:

SELECT id, title, user_id
FROM myTable
ORDER BY CASE WHEN user_id = @search_id THEN 1 ELSE 2 END, user_id

上記の例で@search_idは、1である必要があります。

于 2012-12-10T11:49:40.360 に答える
1

試す:

Article.where(user_id: 1).order("user_id ASC").order("id ASC")

またはこれ:

Article.where(user_id: 1).order("user_id ASC, id ASC")
于 2012-12-10T11:53:05.117 に答える
0

これを試して ::

Select 
*
from 
myTable
order by 
user_id, id

特定のuser_idの場合:

Select 
*
from 
myTable
where user_id='?'
order by 
user_id, id
于 2012-12-10T11:48:34.363 に答える
0

Railsのクエリは次のようになります。

Article.order(Article.send(:sanitize_sql, ["IF(user_id = ?, 1, 2)", params[:user_id]]))

IF(user_id = ?, 1, 2)記事を注文する場合は1または2を返します。sanitize_sql、プライベートメソッドは、パラメータをサニタイズするために使用されます。

params [:user_id]が常に整数である場合、クエリは次のように簡略化できます。

Article.order("IF(user_id = #{params[:user_id].to_i}, 1, 2)")
于 2012-12-10T14:51:35.650 に答える