2016-04-20 166 views
0

我創建了一個貼紙相冊,我需要重複範圍重複的貼紙。 我仍然無法完全理解rails中的示波器。我怎樣才能創建一個範圍,從用戶獲取所有重複的貼紙?Ruby on Rails範圍

Figurinha有一個colada布爾屬性,這意味着貼紙被放置或不在相冊中。

Dep是玩家數據庫,Figurinha獲取Dep模型的名稱,頭像和其他信息。

repetida是我試圖創建的方法來檢查figurinha是否重複。

Figurinha具有相同userdep至極另一個記錄A figurinha重複已經被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是玩家數據庫,Figurinha從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所以我們現在有代表團我們只需要在組數大於1的情況下考慮重複。

+0

我們快到了。用戶只能有colada = true的同一dep的一個figurinha。 –

+0

好的,那麼你需要從where語句中刪除'colada = true' –

+0

@ViniciusFontoura讓我們來看看你的工作是否有(「bool_or(colada)= true」)我們從組記錄中獲得所有的colada並檢查如果或者他們會給我們的真實,這意味着其中一個是真實的,這意味着其中一個是colada,並且當您呈現您的記錄時跳過真正的(主colada) –