Какой самый простой способ найти модель соединения по двум сущностям при использовании has_many: через - PullRequest
3 голосов
/ 26 мая 2009

Я использую has_many :through, чтобы указать связь «многие ко многим» между двумя сущностями, и я хочу иметь возможность легко извлекать модель из таблицы соединений. Вот основные объекты:

class Group < ActiveRecord::Base
    has_many :memberships
    has_many :members, :through => :memberships
end 

class Member < ActiveRecord::Base
    has_many :memberships
    has_many :groups, :through => :memberships
end 

Таблица объединения называется «членство» и имеет дополнительный атрибут «администратор», который указывает, что пользователь может выступать в качестве администратора группы для этой группы. Вот фрагмент миграции:

create_table :memberships do |t|
  t.integer :group_id
  t.integer :member_id
  t.boolean :admin

  t.timestamps
end

Теперь в моем контроллере я хочу проверить, является ли конкретный участник администратором группы. В настоящее время у меня есть следующий код (который работает):

membership = @member.memberships.find_by_group_id(@group.id)

Мой вопрос: существует ли более элегантный способ получения объекта соединения (членства), чем использование помощника find_by_group_id?

Ответы [ 2 ]

4 голосов
/ 27 мая 2009

Аводируя вспомогательные методы, вы можете написать:

  @member.admin?(@group)

с чем-то вроде этого (не проверено!).

  class Member < ActiveRecord::Base

    has_many :memberships
    has_many :groups, :through => :memberships
    named_scope :admin?, :through => :memberships, 
    lambda {|group|:conditions=> ["admin = 'true' and group_id = ?"], group.id }
  end
4 голосов
/ 26 мая 2009

Вы можете спросить:

  @member.is_admin?(@group)

с чем-то вроде этого.

  class Member < ActiveRecord::Base

    has_many :memberships
    has_many :groups, :through => :memberships

    def is_admin?(group)
      memberships.find_by_group_id(group.id).admin?
    end

  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...