【发布时间】:2019-07-23 02:50:55
【问题描述】:
我有一个用于表单的过滤器,我只想显示那些电子邮件与当前用户匹配的表单。
涉及的属性:用户的电子邮件、职业的收件人、地区名称
Careers belongs_to :region 并且我目前正在显示 Region,在我的视图中包含以下内容:
-@careers.each do |career|
th =career.region&.name
因此逻辑是将 current_user.email 与所有 Careers.recipienct 进行比较,如果存在则仅显示那些代表的区域。
例如:
Region | Career | Recipients
Pacific Northwest | Data Analyst | john@doe.com, jill@excite.com
所以我知道它需要点击我的区域选择,如下所示:
= select_tag :region_id,
options_from_collection_for_select(sort_region, :id, :name, params[:region_id]),
include_blank: 'All Regions'
sort_region 目前有:
def sort_region
Region.where.not(name: ['HQ', 'Canada'].sort_by(&:position)
end
所以我的想法是用类似的方式来处理比较:
def user_region
if current_user.super_admin?
return sort_region
else
arr = []
Career.all.each do |emails|
arr << emails.recipient
end
if arr.include?(current_user.email)
return BLANK
end
end
end
空白是我卡住的地方。我只想显示Career.recipient 与current_user.email 匹配的那些区域。
我为基本上讨厌的回报写了以下内容
return Region.joins(:career).where("region.name = career.region&.name")
这实际上返回
无法将“区域”加入名为“职业”的关联
我尝试时同样的问题
return Region.joins(:career).where("careers.region_id = region.id")
我应该在这里使用正确的联接关联吗?
编辑: 如果我能弄清楚如何通过电子邮件向数组推送第二个值,我想我可以解决返回问题。
比如:
arr = []
Career.all.each do |emails|
arr << emails.recipient
arr << emails.region_id
end
if arr.include?(current_user.email)
return region_id
end
所以这不会像我希望/想要的那样创建一对 [["john@doe.com", 2], ["jane@excite.com", 3]] 而是 ["john@ doe.com”,2,“jane@excite.com”,3]。此外,我无法返回 region_id。所以我只需要访问整数。
也许我应该创建所有项目的哈希然后从那里提取?
另一个编辑:
尝试将条件放在迭代中。
arr = []
Career.all.each do |emails|
if emails.recipient == current_user.email
arr << emails.region_id
end
end
然而,这显示了包含 [1] 的 arr,它不是关联的 region_id。
第三次编辑:
我最近的尝试是查看加入,我只需拉出那些职业收件人等于 current_user.email 的区域。
Region.find(:all, joins: ' JOIN regions ON careers.region_id', conditions: "#{current_user.email} = careers.recipient")
这导致找不到您要查找的区域。
【问题讨论】:
-
这个错误
Can't join 'Region' to association named 'career'可以被Region.joins(:careers)纠正,因为我假设基于你的代码的其余部分,Region有很多Careers
标签: ruby-on-rails