2016-12-17 2 views
2

Я пытаюсь узнать, как писать области в Rails 5.Rails 5 - как написать область

У меня есть модель пользователя и модель предложения. Ассоциации являются:

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

has_many :proposals 

Предложение:

belongs_to :user 

В моей модели предложения, Im пытаясь выяснить, как написать сферу, которая находит предложения, которые принадлежат пользователю которые их создали.

Я пытаюсь:

scope :proponent, -> { where(user_id: user.id) } 

Я попробовал миллион вариаций на это, но я не могу найти тот, который работает.

Эта конкретная попытка дает эту ошибку:

2.3.1p112 :001 > Proposal.proponent 
NameError: undefined local variable or method `user' for Proposal (call 'Proposal.connection' to establish a connection):Class 

Я также попытался:

scope :proponent, -> { where('proposal.user_id = ?', user.id) } 

ошибка, я получаю от этой попытки является:

undefined local variable or method `user' for #<Class:0x007fd3600eb038> 

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

Может ли кто-нибудь увидеть, что мне нужно сделать, чтобы проверить таблицу предложений, чтобы найти те, которые принадлежат определенному пользователю?

+0

Почему бы вам просто не воспользоваться ассоциации у вас уже есть, и сделать 'user.proposals' ? –

+0

Потому что я пытаюсь использовать Pundit - который принимает области. – Mel

+0

Это [этот пандит] (https://github.com/elabs/pundit)? если это так, я не уверен, что упомянутые области являются областями рельсов. Из README он говорит: «Второй аргумент - это область действия, на которой выполняется какой-то запрос. Обычно это класс ActiveRecord или ActiveRecord :: Relation, но это может быть что-то другое». Поэтому использование user.proposals должно быть прекрасным. –

ответ

4

Вам необходимо передать user или user_id в качестве аргумента при вызове области. Вы можете определить это следующим образом:

scope :proponent, ->(user){ where(user_id: user.id) } 

или

def self.proponent(user) 
    where user_id: user.id 
end 

Это действительно одно и то же.

Затем назвав его:

Proposal.proponent(user) 
# => returns a list of proposals for the specific user 

Примечание это то же самое, как говорят

proposal = Proposal.find_by(...) 
proposal.user.proposals 
+0

Когда он пробует область действия, которую вы предлагаете, я получаю сообщение об ошибке: неправильное количество аргументов (задано 0, ожидаемое 1) – Mel

+0

И я получаю ту же ошибку, когда пытаюсь изменить область действия так, как вы ее написали «user_id» внутри первого набора() – Mel

+0

@Mel Первая ошибка означает, что вы говорите 'Proposal.proponent' вместо' Proposal.proponent (user) '. –

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