Rails 5 - 如何编写范围

Mel*_*Mel 8 ruby scope ruby-on-rails

我试图学习如何在Rails 5中编写范围.

我有一个用户模型和一个提案模型.协会是:

用户:

has_many :proposals
Run Code Online (Sandbox Code Playgroud)

提案:

belongs_to :user
Run Code Online (Sandbox Code Playgroud)

在我的提案模型中,我试图弄清楚如何编写一个范围来查找属于创建它们的用户的提案.

我在尝试:

scope :proponent,   -> { where(user_id: user.id) }
Run Code Online (Sandbox Code Playgroud)

我已经尝试了一百万种变体,但我找不到一种有效的.

此特定尝试会出现此错误:

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

我也尝试过:

scope :proponent, -> { where('proposal.user_id = ?', user.id) }
Run Code Online (Sandbox Code Playgroud)

我从这次尝试中得到的错误是:

undefined local variable or method `user' for #<Class:0x007fd3600eb038>
Run Code Online (Sandbox Code Playgroud)

我不知道错误消息是否意味着我在尝试中第一次或第二次写"用户"是不正确的.我不知道"叫什么'Proposal.connection'的意思是".

任何人都可以看到我需要做什么才能检查提案表以找到属于特定用户的提议表?

max*_*ner 12

调用范围时,您需要传递useruser_id作为参数传递.您可以这样定义:

scope :proponent,   ->(user){ where(user_id: user.id) }
Run Code Online (Sandbox Code Playgroud)

要么

def self.proponent(user)
  where user_id: user.id
end
Run Code Online (Sandbox Code Playgroud)

这些确实是一回事.

然后调用它:

Proposal.proponent(user)
# => returns a list of proposals for the specific user
Run Code Online (Sandbox Code Playgroud)

请注意,这与说法相同

proposal = Proposal.find_by(...)
proposal.user.proposals
Run Code Online (Sandbox Code Playgroud)