0

User、Task、および UserTask の 3 つのテーブルがあります (外部キーとして User と Task があり、他の列はありません)。UserTask テーブルのエントリは、特定の User/Task の組み合わせに対して存在する場合と存在しない場合があります (UserTask レコードは、スケーラビリティ上の理由から必要に応じて作成されます)。

私の見解では、現在ログインしているユーザーのすべてのタスクを表示したいと思います。UserTask テーブルに対応するレコードが存在する場合、タスクごとに「yes」というテキストを表示したいと考えています。それ以外の場合は、「いいえ」と表示します。しかし、コントローラーからビューに渡すオブジェクトと、ビューに渡されたオブジェクトとの対話方法 (つまり、何ができるか) が少しわかりません。

User、Tasks、および UserTasks をコントローラーからビューに個別の変数として渡す必要がありますか? このように、Tasks 変数を反復処理するだけですべての Task を表示できますwhere。各 Task について、ビューで (ActiveRecord クエリ) を使用して、各 Task に UserTask があるかどうかを判断できます。問題は、ビューに渡されたオブジェクトに対してクエリを実行しwhereても大丈夫ですか? findビューに渡されたオブジェクトの反復など、コントローラーに任せて、ビューで単純なことだけを行うと常に想定していました(間違っている場合は修正してください)。

または、各キーがタスクで、各値が UserTask であるコントローラーでハッシュを作成し、そのハッシュをビューに渡す必要がありますか? このようにして、すべてのキーを反復処理するだけですべてのタスクをビューに表示できます。各タスク キーについて、値が null かどうかをチェックして「はい」または「いいえ」を表示できます。

それとも別の方法がありますか (つまり、テーブルを結合するか何か...どのように機能するかわかりません)?

4

1 に答える 1

0

まず、レールの関連付けについてよく読んでおく必要があります。

http://guides.rubyonrails.org/association_basics.html

ユーザーとタスクの間の関係を設定しようとしている方法は少し奇妙に思えますが、それはさておき、説明したように実装するには、UserTaskおよびUserTaskモデルで関連付けを定義します。

class User < ActiveRecord::Base
  has_many :user_tasks
end

class Task < ActiveRecord::Base
  has_one :user_task
end

class UserTask < ActiveRecord::Base
  belongs_to :user
  belongs_to :task
end

コントローラーで:

@user = User.includes(:user_tasks).find(...)
@tasks = Task.all

次に、あなたの見解で(hamlで):

-@tasks.each do |task|
  =(@user.user_tasks.include?(task)) ? "yes" : "no"

編集:コメントの説明に従って更新されました。

于 2012-07-30T02:34:34.553 に答える