gpt4 book ai didi

ruby-on-rails - 具有方法值比较的 Rails 作用域

转载 作者:数据小太阳 更新时间:2023-10-29 08:59:58 26 4
gpt4 key购买 nike

所以我对 Rails 和 ActiveRecord 还很陌生我需要一个在 Client 之间过滤的范围实体。基本上范围应该返回所有 Client记录客户端当前状态等于某个状态对象。

这是通过获取客户的最后一个 state_change 计算得出的然后拉那个state_changefrom_state这是 State目的。

我已经定义了一个方法来返回 current_state但是在 Rails 控制台中,当我用 Client.current_state(Client.last) 测试它时我收到此错误:

NameError: undefined local variable or method 'state_changes for #<Class:0x0000000685eb88>但是在运行时 Client.last.state_changes在控制台中它工作正常。

我的客户.rb

class Client < ActiveRecord::Base
has_and_belongs_to_many :users
belongs_to :industry
belongs_to :account
has_many :contacts
has_many :state_changes
belongs_to :head, class_name: "Client"
has_many :branches, class_name: "Client", foreign_key: "head_id"
has_many :meetings, through: :contacts
has_many :sales, through: :meetings

scope :prospects, -> (client) { where(Client.current_state(client): State.PROSPECT_STATE) }

def self.has_at_least_one_sale? (client)
return client.sales.empty?
end

def self.has_account_number? (client)
return client.account_number.present?
end

def self.current_state (client)
state_changes.last.to_state
end
end

状态变化.rb

class StateChange < ActiveRecord::Base
belongs_to :client
belongs_to :from_state, class_name: "State", foreign_key: :to_state_id
belongs_to :to_state, class_name: "State", foreign_key: :from_state_id
end

状态.rb

class State < ActiveRecord::Base
has_many :from_states, class_name: "StateChange", foreign_key: :to_state_id
has_many :to_states, class_name: "StateChange", foreign_key: :from_state_id

def self.PROSPECT_STATE
return State.find_by name: 'Prospect'
end

def self.CLIENT_STATE
return State.find_by name: 'Client'
end

def self.SUSPECT_STATE
return State.find_by name: 'Suspect'
end
end

我还收到有关我在 client.rb 中定义的范围的语法错误。我关注了ActiveRecord指南,但他们没有解释如何在实际范围查询中使用链接方法。

最佳答案

出现错误的原因 NameError: undefined local variable or method 'state_changes for #<Class:0x0000000685eb88>是因为你定义了current_state作为类方法并将客户端作为参数传递。这就是为什么 state_changes在类而不是实例上调用。在这种情况下,您需要使用客户端来获取 state_changes .

def self.current_state (client)
client.state_changes.last.to_state
end

此外,作用域仅用于链接查询逻辑。我不确定是否可以仅使用查询来获得您想要的结果。我希望我能正确理解你的逻辑。或者,您可以使用类方法。

def self.prospects (client)
Client.all.select { |c| c.current_state(c) == State.PROSPECT_STATE }
end

正如 Зелёный 在评论中所指出的,也许您还想将方法更改为实例方法,在这种情况下,阅读他链接的资源会非常有帮助。

根据评论更新:

我认为您真正想要的是为 current_state 使用实例方法像这样:

def current_state
state_changes.last.to_state
end

然后你可以得到这样的前景:

def self.prospects
Client.all.select { |c| c.current_state == State.PROSPECT_STATE }
end

关于ruby-on-rails - 具有方法值比较的 Rails 作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38184701/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com