2013-12-24 2 views
1

Я пытался выяснить, как лучше всего создать систему флагов пользователя в рельсах 3.1. Я экспериментировал с камнем make_flaggable, но он не дал мне то, что мне было нужно.Как я могу создать систему флагов для сообщений?

Я использую устройство для моей модели пользователя, и у меня есть модель Post, принадлежащая пользователю. Мне нужно получить список всех сообщений, помеченных с админкой сайта. До сих пор мне было трудно получить это.

Я не уверен, какой тип отношений мне нужно использовать между моделью флага и моделью Post/User. Я читаю «Полиморфные отношения», и это выглядит многообещающе.

Любые идеи или отзывы будут высоко оценены!

+0

Вы прочитали образец использования и сделали это? –

ответ

6

Очень легко свернуть свое собственное решение. Я бы сделал это так.

class User 
    has_many :flags 
end 
class Post 
    has_many :flags 
end 
class Flag 
    belongs_to :user 
    belongs_to :post 
end 

Вы можете получить сообщения, отмеченные флажком, пройдя через модель флага или модель публикации.

# since a post has many flags 
# you will get duplicates for posts flagged more than once 
# unless you call uniq 
flagged_posts = Post.joins(:flags).uniq 

Или через модель флагов:

flags = Flag.includes(:post).uniq 
flags.each do |flag| 
    puts flag.post 
end 

Чтобы убедиться, что вы не получаете дубликаты флаги на той же должности с тем же пользователем, я бы добавить индекс Uniq в миграции:

def change 
    create_table :flags do |t| 
     t.belongs_to :user, null: false 
     t.belongs_to :post, null: false 
     t.timestamps 
    end 
    add_index :flags, [:user_id, :post_id], unique: true 
    end 
+0

Это именно то, что я искал ... Спасибо! –

+0

Понятное объяснение, спасибо! – dlu

1

Возможно, я не понимаю, что вы пытаетесь сделать, но почему бы просто не добавить столбец в таблицу Posts, называемую «помечен?»? Затем вы можете просто сделать User.posts (: where =>: flagged => true).