У меня есть элемент модели, на который пользователи могут проголосовать, создав новый UpVote или DownVote. Когда создается UpVote или Downvote, он записывает IP-адрес пользователя и идентификатор Item. Я хочу перечислить массив из первых 100 элементов, которые не были проголосованы за текущий ip пользователя.Есть ли более эффективный способ получения этого массива?
До сих пор, вот что у меня есть:
схема
create_table "up_votes", force: true do |t|
t.string "ip"
end
create_table "down_votes", force: true do |t|
t.string "ip"
end
модель
class Item < ActiveRecord::Base
def up_votes_array
self.up_votes.map(&:ip).to_a
end
def down_votes_array
self.down_votes.map(&:ip).to_a
end
def up_voted?(ip)
self.up_votes_array.include? ip
end
def down_voted?(ip)
self.down_votes_array.include? ip
end
контроллер
@not_voted = Item.where(show: true).select { |item| !item.up_voted?(request.remote_ip) }.select { |thing| !item.down_voted?(request.remote_ip) }.sort_by(&:alphabetical).reverse.first(100).shuffle
Это работает, но есть кое-что обо всем, что кажется, что излишне сложным, и я боюсь, что, как растет моя база данных, она может стать неэффективным. Есть ли более эффективный способ получить этот массив?
Я использую Rails 4 и Sqlite3.
что 'Thing' здесь. И что это за связь с Item? – kiddorails
К сожалению, я перепутал его с другим столом, который у меня есть. Предполагается, что это «Элемент». –