我正试图掌握导轨范围。我有简单的基础知识,但我试图创建一个稍微复杂的范围,我遇到了一些麻烦。
class Client
has_many :referrals, through: :submissions
has_one :address
has_many :submissions
end
class Submission
belongs_to :client
belongs_to :user
has_many :referrals, :inverse_of => :submission, dependent: :delete_all
end
class Referral
belongs_to :branch
belongs_to :submission
has_one :client, through: :submission
end
class Address
belongs_to :client
end
我也有使用设计创建的用户。我将一个自定义属性添加到名为city_town
的用户。
当用户注册时,他们会选择他们所在的城市或城镇以及他们所在的代理机构。创建提交时,它们会获取客户端详细信息和地址的嵌套属性以及引用详细信息。推荐会使用一个agency_id来指定转介的目的地。
我想要实现的是创建一个范围,收集referral.client.address.city_town
与当前用户的城市或城镇相匹配的所有推介,即:current_user.city_town
并且推介的agency_id与agency_id匹配签名用户。
简而言之,当用户登录时,他们只能看到他们的代理机构和区域的推介。
到目前为止,我已经:
class Referral
scope :agency_referrals, -> (id, city_town) { includes(:clients).where(agency_id: id, client.address.city_town => city_town) }
end
但我痛苦地意识到这远非正确。我收到这个错误:
undefined local variable or method `client' for #<Class:0x00000003200c08>
知道我哪里出错了?
答案 0 :(得分:2)
您收到此特定错误,因为您在查询中不正确地引用city_town。 mysqli
意味着此哈希中的键是嵌套在现有&#34;客户端中的值&#34;变量。这更为正确,可能会消除您刚刚遇到的特定错误:
顺便说一句,评论者Pavan是正确的,client.address.city_town => city_town
在你的:client
陈述中应该是单数的。也就是说,我还将它扩展为预先包含地址表,这可能会导致其他错误。
.includes()
另外,如果您正在寻找引用正确位置的非字符串方法(因为这是Ruby,我们喜欢我们的符号),您可以写下:
# The .includes() parameters have been changed, and quotes have been added to the query.
scope :agency_referrals, -> (id, city_town) { includes(client: :address).where(agency_id: id, 'client.address.city_town' => city_town) }
我个人觉得这个不太干净,但它更像是现代的#34;格式。
如需进一步参考,您可以查看this documentation。
答案 1 :(得分:0)
includes(submission: :clients)