Rails范围与嵌套关联

时间:2016-02-17 13:02:04

标签: ruby ruby-on-rails-4 devise scopes

我正试图掌握导轨范围。我有简单的基础知识,但我试图创建一个稍微复杂的范围,我遇到了一些麻烦。

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>

知道我哪里出错了?

2 个答案:

答案 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)
相关问题