【问题标题】:Rails set filter by the current user - joins association issue当前用户的Rails设置过滤器-加入关联问题
【发布时间】: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


【解决方案1】:

Arel_table 获胜

Region.joins(:careers).where(Career.arel_table[:recipient].matches("%#{current_user.email}%"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多