Как найти модели без звездочек с act_as_rateable - PullRequest
0 голосов
/ 12 июня 2009

У меня есть приложение rails, использующее плагин acts_as_rateable.

Я застрял в выяснении, как извлечь модели без рейтинга с помощью этого плагина - однако это скорее общий вопрос rails / SQL, чем специфический для этого плагина.

Действует как оцениваемое, добавляет к схеме следующее:

create_table "ratings", :force => true do |t|
    t.integer  "rating",                      :default => 0
    t.string   "rateable_type", :limit => 15, :default => "", :null => false
    t.integer  "rateable_id",                 :default => 0,  :null => false
    t.integer  "user_id",                     :default => 0,  :null => false
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "ratings", ["user_id"], :name => "fk_ratings_user"

И мои оцененные модели также имеют столбец идентификатора пользователя.

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

class Review < ActiveRecord::Base
  acts_as_rateable

  belongs_to :user
  ...
end

Итак, я хочу что-то вроде следующего псевдокода

Review.find(:all, :conditions=>"not rated by anyone")
Review.find(:all, :conditions=>"not rated by anyone except review.user")

Однако я не могу понять, как это сделать с помощью SQL, так и с помощью магии рельсов, чтобы генерировать этот SQL: -)

Обновление: этот запрос, кажется, находит все модели, которые оцениваются кем-то, кроме пользователя, которому принадлежит модель. Поэтому я думаю, что мне просто нужно как-то инвертировать это.

 Review.find(:all, 
  :joins=>'left join ratings on reviews.id=ratings.rateable_id && ratings.rateable_type="Review"', 
  :conditions=>'reviews.user_id <> ratings.user_id', 
  :group=>'reviews.id')

Ответы [ 2 ]

1 голос
/ 12 июня 2009

Именованные области являются способом решения этой проблемы. Я бы добавил две именованные области к вашей модели Review. Что-то вроде:

class Review < ActiveRecord::Base
  acts_as_rateable

  belongs_to :user

  named_scope :not_rated, :conditions => { :rating => 0 }
  named_scope :not_rated_by_others,
              :conditions => ["user != ? AND rating == 0", self.user]
end

Тогда вы можете сделать:

@not_rated = Review.not_rated
@not_rated_by_others = Review.not_rated_by_others

Существует Railscast, который объясняет именованные области действия .


РЕДАКТИРОВАТЬ: Вторая попытка

Правильно, давай еще раз пойдем! Одна из проблем заключается в том, что существует несколько acts_as_rateable плагинов. Я тестировал, используя этот на RubyForge.

class Review < ActiveRecord::Base
  belongs_to :user

  acts_as_rateable

  named_scope :not_rated, :select => 'reviews.*',
              :joins => 'left join ratings on reviews.id = ratings.rateable_id',
              :conditions => 'ratings.rateable_id is null'

  named_scope :not_rated_by_others, lambda { |user| { :select => 'reviews.*',
              :joins => 'left join ratings on reviews.id = ratings.rateable_id',
              :conditions => ['ratings.user_id != ? and ratings.rateable_id is null',
                 user] }}
end

Используйте это так:

frank = User.find_by_name('frank')
@not_rated = Review.not_rated
@not_rated_by_others = Review.not_rated_by_others(frank)
0 голосов
/ 13 июня 2009

У меня есть способ использовать запрос вроде этого:

Review.find(:all, 
 :joins=>'left outer join ratings on reviews.id=ratings.rateable_id && ratings.rateable_type="Review"',
  :conditions=>'ratings.rating is NULL')

Похоже, что возвращаются все модели Review без оценки.

И я думаю, что этот работает, чтобы найти все модели обзора, которые не были оценены пользователем, который создал обзор:

Review.find(:all, 
  :joins=>'left outer join ratings on reviews.id=ratings.rateable_id && ratings.rateable_type="Review" && ratings.user_id <> reviews.user_id',
  :conditions=>'ratings.rating is NULL')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...