Как я могу сделать поиск в Rails с условиями, установленными в таблице соединений ассоциации: through? - PullRequest
1 голос
/ 19 октября 2010

У меня есть следующие модели:

class User < ActiveRecord::Base
  has_many :permissions
  has_many :tasks, :through => :permissions

class Task < ActiveRecord::Base
  has_many :permissions
  has_many :users, :through => :permissions

class Permission < ActiveRecord::Base
  belongs_to :task
  belongs_to :user

Я хочу отображать только те задачи, к которым у пользователя есть доступ (т. Е. В таблице Permissions установлен флаг read). Я могу сделать это с помощью следующего запроса, но он мне не кажется очень Rails-y:

@user = current_user
@tasks = @user.tasks.find_by_sql(["SELECT * FROM tasks INNER JOIN permissions ON tasks.id = permissions.task_id WHERE permissions.read = true AND permissions.user_id = ?", @user.id])

Кто-нибудь знает правильный способ сделать это?

Ответы [ 2 ]

1 голос
/ 19 октября 2010

Отвечая на мой собственный вопрос, Rails фактически позволяет вам устанавливать условия для самой ассоциации.Так, например, в моей модели User я бы изменил эту ассоциацию has_many так:

has_many :tasks, :through => :permissions, :conditions => 'permissions.read = true'

Довольно аккуратно.Решение, предложенное Trip, также работает (за исключением того, что, по крайней мере, для MySQL «true» не следует заключать в кавычки).Клянусь, я попробовал это ...!

0 голосов
/ 19 октября 2010

Извините, это быстрое предположение.извините, если это не так.

@user.tasks.find(:all, :conditions => "permissions.read = 'true' ")
...