2016-08-15 3 views
0

Я пытаюсь научиться писать области в приложении Rails 4.Rails 4 - как написать область для исключения одной записи

У меня есть модели под названием «Пользователь», «Профиль», «Проект» и «Потенциальное использование». Ассоциации являются:

Пользователь

has_one :profile 
has_many :potential_uses 

Профиль

belongs_to :user 
has_many :projects 

Проект

belongs_to :profile 
has_many :potential_uses 

Потенциальный Использует

belongs_to :project 
belongs_to :user 

У меня есть атрибуты в моей потенциальном использовании таблицы для:

:comment 
:internal_comments_permitted 
:external_comments_permitted 

У меня есть области в моем потенциале использует модель:

scope :internal_comments_permitted, -> where(:internal_comments_permitted => 'true') 
    scope :external_comments_permitted, -> where(:external_comments_permitted => 'true') 

то у меня есть метод класса для нахождения всех комментариев третьих лиц :

def third_party_comments 
    self.internal_comments_permitted.external_comments_permitted 
end 

Теперь я пытаюсь написать сферу, чтобы исключить какие-либо комментарии, сделанные пользователем, который имеет профиль, что проект принадлежит, из группы замечаний третьих лиц.

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

scope :third_party_comments, -> where(:comment.user_id != potential_uses.project.profile.user_id) 

Я знаю, что это неправильно, но я не могу понять, что не так с этой попыткой.

Принимая предложение Hasmukh с в подстройке от Ниниги:

scope :third_party_comments, ->(potential_uses.project.profile.user_id) { where.not(comments: {user_id: potential_uses.project.profile.user_id}) } 

, но это дает ошибку, которая говорит:

syntax error, unexpected '.', expecting ')' 
...ty_comments, ->(potential_uses.project.profile.user_id) { wh... 

ответ

1

Вы почти там.

scope :third_party_comments, -> where(:comment.user_id != potential_uses.project.profile.user_id) 

where принимает хэш или массив фрагментов SQL, но вы вроде получили условный вместо этого. Таким образом, вы не можете достаточно сделать это, как указано выше, но вы можете использовать фрагменты SQL, например, попробуйте:

scope :third_party_comments, -> { where("comment.user_id <> ?", potential_uses.project.profile.user_id) } 

Это использует массив-синтаксис Rails - первый элемент представляет собой небольшой кусок чистого SQL - который использует <> означает «не равно» и использует знак вопроса, чтобы указать «второе значение идет здесь» (но безопасно дезинфицированным способом)

Примечание: не проверено на ошибку, может потребоваться незначительное смещение, чтобы сделать это Работа...Я проверил Rails Guide на интерфейсе Query для более подробной информации о том, что вы можете и чего не можете сделать: http://guides.rubyonrails.org/active_record_querying.html

(На самом деле, я настоятельно рекомендую прочитать все направляющие Rails как способ повышения уровня как работает Rails).

Я также обновил область, чтобы добавить фигурные скобки вокруг лямбда - это рекомендуется для областей Rails в наши дни.

+0

@Taryn_East Спасибо за это предложение. Несколько раз я читал все руководства. Я просто перечитаю Руководство по интерфейсу запросов к активной записи - я не могу найти ничего в руководстве, которое объясняет, что означает первый хэш в where(). Что означает «<>»? Спасибо еще раз за помощь. – Mel

+1

Я попробовал предложение. Я получаю сообщение об ошибке (для которого я еще не понял, как перевести на английский): синтаксическая ошибка, неожиданное '(', ожидающее ключевое слово_до_LAMBDA или tLAMBEG ... third_party_comments, -> где ("comment.user_id <>? ", pote ... ... – Mel

+0

Я расскажу подробнее ... –

2

Попробуйте это:

scope :third_party_comments, ->where.not(comment.user_id: potential_uses.project.profile.user_id) 

Ссылка: Active Record Query Interface

+0

@ Hasmukh_Rathod. Спасибо за предложение. Я пробовал это, но, похоже, у него где-то ошибка: синтаксическая ошибка, неожиданная '. ', ожидая ключевое слово_do_LAMBDA или tLAMBEG ... third_party_comments, -> where.not (comment.user_id: potentia ... – Mel

+0

Вы видите, что не так? Я не знаю, что означает tLAMBEG. – Mel

+0

Между промежутком между пробелами должно быть не должно быть - > и where.not.Я обновил свой ответ. –

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