2013-05-25 4 views
1

Я строю своего рода красноватый клон, чтобы снова взять рельсы. У меня есть таблица posts и таблица votes.Атрибут activerecord, основанный на соединении?

Сообщений:

create_table :posts do |t| 
    t.belongs_to :user 
    t.string :title 
end 

Голосов:

create_table :votes do |t| 
    t.belongs_to :post 
    t.belongs_to :user 
    t.string :sort_of_vote 
end 

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

Так что я хотел бы что-то вроде:

Post.all.first.liked?

Я думаю, хороший способ сделать это. Что я не хочу: запрос понравился? вызов метода. Что было бы хорошим способом добиться этого?

ответ

0

Читайте о Eager Loading Associations, в частности, раздел о решения на N + 1 запросов проблемы, которая использует includes

@posts = Post.includes(:votes) 

Теперь вы можете создать метод на Post как

def liked? 
    !votes.empty? 
end 

и вызывать его без запроса запроса для каждого элемента в наборе Тион.

0

Это то, что вы хотите?

class User 
    def liked_posts 
    @liked_posts ||= self.votes.posts 
    end 
    def likes?(post) 
    @liked_posts.include?(post) 
    end 
end 

class Post 
    def liked?(user) 
    user.liked_posts.include?(self) 
    end 
end 

Это должно извлекать список любимых сообщений один раз и кэшировать его. Затем, когда вы вызываете post.liked? (User) или user.likes? (Post), он сможет использовать кэшированные данные, чтобы определить, нравится ли пользователю этот пост.

+0

Я * думаю * он ищет коллекцию сообщений с флагом на каждом экземпляре, независимо от того, понравился ли он пользователям 1+ или нет. – deefour

+0

@ Дайфур, если это так, тогда ваш ответ намного лучше моего. Я предположил, что он хотел поставить галочку рядом с сообщением, если пользователю это понравилось. –

+0

Извините, что я не был абсолютно ясен :(Я искал отметку стрелки upvote как «проверенную», когда пользователю это понравилось. Поэтому я думаю, что этот ответ больше того, что я искал. Я думал о чем-то подобном сам, но Мне было интересно, может ли быть более рельс-y способ сделать это. – Leon

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