2016-03-24 20 views
1

Ben ilişki has_many var - Has_many gibi: Ben Baz.first.bar_ids yaparsanızFoo_ids yöntemi için neden raylar birleştirilir?

class baz < ActiveRecord::Base 
    has_many :foo 
    has_many :bar, through: :foo 
end 

class foo < ActiveRecord::Base 
    belongs_to :baz 
    belongs_to :bar 
end 

class bar < ActiveRecord::Base 
    has_many :foo 
    has_many :baz, through: :foo 
end 

, raylar ... Çubuk neden masaya katılmak yerine foo tablosunda bar_id olsun? beklenen

SELECT `bar`.id FROM `bar` INNER JOIN `foo` ON `bar`.`id` = `foo`.`bar_id` WHERE `foo`.`baz_id` = 1 

:

SELECT [DISTINCT] `foo`.bar_id FROM `foo` WHERE `foo`.`baz_id` = 1 

cevap

1

Eğer bar tablodan bir satır sildi eğer bar_ids, foo tabloda var dönecektir Kişisel beklenen sonuç Her zaman onun kimliğini karşılığında alacaksın.

Raylar, aradığınız öğenin tabloda var olmasını bekler. Baz, trougth:

Düzenleme

Bu davranışı değiştirmek için

class Baz < ActiveRecord::Base 
    has_many :foo 
    has_many :bar, through: :foo 

    def bar_ids 
     Foo.uniq.pluck(:bar_id).where(baz_id: self.id) 
    end 
end 
+0

okunu kullanıyorum, bu davranışı değiştirmek mümkün mü? Bunu nasıl geçersiz kılıyor? – Matrix

+0

@Matrix, cevabı düzenledim –

1

kurulum için bağımsız bir varlık olarak ilişki modeli gerekirse bir has_many :through ilişki kurmalıyım Faydasız palanyadan

SQL günlüğü var. Onay modelinde doğrulamalara, geri çağrılara veya ekstra özniteliklere ihtiyacınız varsa has_many :through kullanmalısınız.

class baz < ActiveRecord::Base 
    has_many :foo 
    has_many :bar, through: :foo 
end 

class foo < ActiveRecord::Base 
    belongs_to :baz 
    belongs_to :bar 
end 

class bar < ActiveRecord::Base 
    has_many :foo 
    has_many :baz, through: :foo 
end 

sonuçta aşağıdaki gibi bir şey olmalı altındaki ilgili örnek olacak:

# baz = Baz.first 
# bar = Bar.first 

# baz.foo.create(bar: bar) 

# baz.bars #= [bar] 
+0

ben 'Has_many eklemek Baz sınıfa bar_ids yöntemi ekleyin yapabilirsiniz: Bu slove değil sorunun foo' – Matrix

+1

o olacak 'aracılığıyla olmak:: foo' değil ': foo:. Lütfen yazım hatası düzeltin. –

+0

Bu, mesajdaki bir hataydı, fakat kodda ^^ – Matrix

İlgili konular