У меня есть ассоциация ролей, нужен метод содержит? - PullRequest
2 голосов
/ 08 марта 2011

У меня есть модель User с коллекцией ролей.

Коллекция ролей имеет следующие столбцы:

id, name, ....

Теперь я перебираю другую коллекцию и хочу создать новую коллекцию, если значение role_id соответствует, поэтому:

SomeOtherCollection.each do |i|

@blah << i  if self.Roles.contains i.role_id

end

Содержит не существует, как я могу это сделать?

Чем быстрее метод, тем лучше, так как это произойдет много.

Ответы [ 3 ]

2 голосов
/ 08 марта 2011

Предполагая, что Role является моделью ActiveRecord, и вы хотите назвать self.roles, а не self.Roles, и вы используете Rails 3:

SomeOtherCollection.each do |i|
  @blah << i  if self.roles.where(:role_id => i.role_id).count > 0
end

Примечание: cancan - это действительно великолепный камень авторизации, который может оказаться полезным.

2 голосов
/ 08 марта 2011

Предполагая, что ваша коллекция включает Enumerable (например, Array и т. Д.), Вы можете использовать any?, который возвращает true, если любая итерация блока возвращаетtrue:

@blah << i if self.Roles.any? { |role| role.id == i.role_id }

Если ваш пользовательский класс настроен так:

class User < ActiveRecord::Base
  # some stuff
  has_many :roles
end

и используемый вами метод находится где-то в классе User, вы, вероятно, хотите что-токак это:

SomeOtherCollection.each do |i|
  @blah << i if self.roles.any? { |role| role.id == i.role_id }
end
0 голосов
/ 08 марта 2011

include? - это метод, который вы хотите

http://www.ruby -doc.org / core / classes / Array.html # M000265

И более рубинспособ сделать то, что вы хотите:

@blah = some_collection.select { |i| self.Roles.include? i.role_id }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...