2014-11-23 4 views
1

у меня есть модель Tag:has_many через, с условиями

name:string 
user_tag: boolean 
private_tag: boolean 

и модель изображения с помощью простого присоединения таблицы (picture_id, tag_id)

Я хочу иметь picture.tags, picture.user_tags , и picture.private_tags, почему следующий код не работает и как его исправить?

has_many :tags, -> { where :private_tag => false and :user_tag => false }, through: :pictures_tags 
has_many :private_tags, -> { where :private_tag => true }, through: :pictures_tags 
has_many :user_tags, -> { where :user_tag => true }, through: :pictures_tags 

!! EDIT !!

Так я не работаю здесь:

has_many :tags, through: :pictures_tags, :source => :tag, :conditions => ['tags.private_tag = ? and tags.user_tag = ?', false, false] 
has_many :private_tags, through: :pictures_tags, :source => :tag, :conditions => ['tags.private_tag = ?', true] 
has_many :user_tags, through: :pictures_tags, :source => :tag, :conditions => ['tags.user_tag = ?', true] 

Но, похоже, возвращается в два раза.

2.1.1 :036 > picture = Picture.last 
Picture Load (0.4ms) SELECT "pictures".* FROM "pictures" ORDER BY "pictures"."id" DESC LIMIT 1 
=> #<Picture id: 378, user_id: 35, picture: "i6.JPG", created_at: "2014-11-23 12:19:35", 
updated_at:"2014-11-23 12:19:35", number_of_votes: 0, number_of_upvotes: 0, 
blurb: "!test @test #test"> 
2.1.1 :037 > picture.private_tags 
Tag Load (0.2ms) SELECT "tags".* FROM "tags" INNER JOIN "pictures_tags" ON "tags"."id" = "pictures_tags"."tag_id" WHERE (tags.private_tag = 't') AND "pictures_tags"."picture_id" = ? [["picture_id", 378]] 
=> #<ActiveRecord::Associations::CollectionProxy 
[#<Tag id: 198, name: "!test", created_at: "2014-11-23 12:19:35", updated_at: "2014-11-23 12:19:35", 
private_tag: true, user_tag: false>, #<Tag id: 198, name: "!test", created_at: "2014-11-23 12:19:35", 
updated_at: "2014-11-23 12:19:35", private_tag: true, user_tag: false>]> 
2.1.1 :038 > picture.private_tags.count 
(0.3ms) SELECT COUNT(*) FROM "tags" INNER JOIN "pictures_tags" ON "tags"."id" = "pictures_tags"."tag_id" WHERE (tags.private_tag = 't') AND "pictures_tags"."picture_id" = ? [["picture_id", 378]] 
=> 2 
+0

Какая версия Rails вы используете? Первый (с областями) для 4.x, а последний (с целями) равен 3.2. – blelump

+0

Im using rails 4 –

+0

Как выглядит 'pictures.pictures_tags'? Вы видите дубликаты в этой таблице? –

ответ

1

У вас могут возникнуть проблемы с синтаксисом. Эти ассоциации:

has_many :private_tags, -> { where :private_tag => true }, through: :pictures_tags 
has_many :user_tags, -> { where :user_tag => true }, through: :pictures_tags 

в порядке. Проблема с:

has_many :tags, -> { where :private_tag => false and :user_tag => false }, through: :pictures_tags 

потому where пункт не принимает условие в качестве аргумента (это не является допустимым условием либо), но Hash. Так было бы:

has_many :tags, -> { where :private_tag => false, :user_tag => false }, through: :pictures_tags 
+0

Я заметил OP о неправильном синтаксисе, он редактирует вопросы. –

+0

Оставайтесь с областями, так как это правильный подход Rails 4. – blelump

+0

yep, я бросаю 'непонятно, что вы спрашиваете', потому что я не понимаю, что вопрос и OP ничего не говорят о неправильном синтаксисе. –

Смежные вопросы