2016-04-20 8 views
0

Я создаю альбом наклейки, и мне нужно развернуть повторяющиеся наклейки. Я все еще не могу полностью понять области в рельсах. Как я могу создать область, которая получает все повторяющиеся наклейки от пользователя?Ruby on Rails Scope

Figurinha имеет атрибут boolean colada, что означает, что наклейка размещена или нет в альбоме.

Dep база данных игроков, Figurinha получить имя, аватар и другие информации от Dep модель.

repetida - метод, который я пытался создать, чтобы проверить, повторяется ли figurinha или нет.

figurinha повторяется, когда Figurinha имеет еще одну запись с тем же user и dep которым уже был colada

User.rb

class User < ActiveRecord::Base 
    has_many :figurinhas 
end 

Figurinha.rb

class Figurinha < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :dep 

    def repetida 
    coladas = self.user.figurinhas.where(colada: true) 
    colodas.map{|a| a.dep}.include?(self.dep) 
    end 

end 

Деп. rb

class Dep < ActiveRecord::Base 
    has_attached_file :avatar 
    validates_attachment_content_type :avatar, :content_type => ["image/jpg", "image/jpeg", "image/png", "image/gif"] 

    belongs_to :partido, foreign_key: :partido, primary_key: :sigla 

    def avatar_from_url(url) 
    self.avatar = open(url) 
    end 
end 
+0

Что такое 'Dep'? – MurifoX

+0

Dep - база данных игроков, Фигуринья получает имя, аватар и другие сведения из базы данных Dep. –

ответ

1

Если figurinha может иметь только один истинный colada для каждого пользователя, вы можете попробовать это:

scope :repetida, ->(user_id) { uniq.where(user_id: user_id, colada: false, dep_id: Figurinha.where(user_id: user_id, colada: true).pluck(:dep_id)) } 
+0

Работает отлично. Можете ли вы объяснить мне использование метода скручивания? –

+1

вы можете прочитать о том, как выщипывать здесь http://apidock.com/rails/ActiveRecord/Calculations/pluck , он возвращает массив значений атрибутов. в вашем случае атрибут 'dep_id' –

1

Заменить

def repetida 
    coladas = self.user.figurinhas.where(colada: true) 
    colodas.map{|a| a.dep}.include?(self.dep) 
end 

с:

scope :repetida, ->(user_id) {where(user_id: user_id).group(:dep_id).having("count(*) > 1").having("bool_or(colada) =true") } 

и вызов должен быть:

Figurinha.repetida(User.first.id) 

который пытается выбрать все Figurinha который принадлежит user_id, а затем сгруппировать их с dep_id, так что теперь мы имеем группы rep Figurinha, но нам нужно только, чтобы подсчет группы был> 1, чтобы рассмотреть дубликат.

+0

Мы почти там. Пользователь может иметь только один figurinha того же депо с colada = true. –

+0

ОК, тогда вам нужно удалить 'colada = true' из оператора where –

+0

@ViniciusFontoura, давайте посмотрим, работает ли это с вами' having ("bool_or (colada) = true") 'мы получаем все colada из записей групп и проверяем если их правильное обращение даст нам истинное значение, что один из них является истинным, что означает, что 1 из них является коладой, и когда вы делаете свои записи пропущенными с истинным (основная колада) –