Ruby on rails Ruby/Rails是一种检查数组中的对象是否存在于其他数组中的方法

Ruby on rails Ruby/Rails是一种检查数组中的对象是否存在于其他数组中的方法,ruby-on-rails,ruby,Ruby On Rails,Ruby,想想这些代码行: @boss_locations = BossLocation.order('min_level asc').all @discovered = current_user.discovered_locations.includes(:boss_location).all 第一个获取所有可用的boss位置。第二个,获取所有发现的用户位置(user\u id、boss\u location\u id),还包括boss\u location对象 现在,在我看来,我想根据@Discov

想想这些代码行:

@boss_locations = BossLocation.order('min_level asc').all
@discovered = current_user.discovered_locations.includes(:boss_location).all
第一个获取所有可用的boss位置。第二个,获取所有发现的用户位置(user\u id、boss\u location\u id),还包括boss\u location对象

现在,在我看来,我想根据@Discovered上是否存在boss位置,显示每个boss位置以及类似“Discovered”或“notdiscovered”的消息

现在,我的问题是如何用一种简单的方法来表达我的观点。我可以遍历两个数组,但我很确定这不是更好的方法。也许有一种很好的方法可以根据用户发现的boss位置映射所有boss位置。你会怎么做

编辑-变量有:

@工作地点:

 => [#<BossLocation id: 670261930, name: "Fire Swamp", location_index: 1, min_level: 5, needed_gold_to_open: 500, created_at: "2011-05-18 05:35:48", updated_at: "2011-05-18 05:35:48">, #<BossLocation id: 723149845, name: "Rabbit Remains", location_index: 3, min_level: 15, needed_gold_to_open: 3000, created_at: "2011-05-18 05:35:48", updated_at: "2011-05-18 05:35:48">, #<BossLocation id: 81327760, name: "Grateful Plains", location_index: 2, min_level: 10, needed_gold_to_open: 1200, created_at: "2011-05-18 05:35:48", updated_at: "2011-05-18 05:35:48">]
=>
@发现:

 => [#<DiscoveredLocation id: 736487645, user_id: 986759322, boss_location_id: 670261930, created_at: "2011-05-22 05:37:01", updated_at: "2011-05-22 05:37:01">, #<DiscoveredLocation id: 736487646, user_id: 986759322, boss_location_id: 723149845, created_at: "2011-05-22 05:37:06", updated_at: "2011-05-22 05:37:06">, #<DiscoveredLocation id: 736487647, user_id: 986759322, boss_location_id: 81327760, created_at: "2011-05-22 06:01:35", updated_at: "2011-05-22 06:01:35">] 
=>

要更好地封装数据模型,您需要修改模型类

class BossLocation < ActiveRecord::Base
  has_many :discovered_locations
  has_many :users, :through => :discovered_locations

  def discovered_by?(user)
    self.users.include?(user)
  end
end
在你看来:

<% @boss_locations.each do |boss_location| %>
  <div>
    <%= boss_location.name %>:
    <%= boss_location.discovered_by?(current_user) ? 'Discovered' : 'Not Discovered' %>
  </div>
<% end %>

:

要更好地封装数据模型,您需要修改模型类

class BossLocation < ActiveRecord::Base
  has_many :discovered_locations
  has_many :users, :through => :discovered_locations

  def discovered_by?(user)
    self.users.include?(user)
  end
end
在你看来:

<% @boss_locations.each do |boss_location| %>
  <div>
    <%= boss_location.name %>:
    <%= boss_location.discovered_by?(current_user) ? 'Discovered' : 'Not Discovered' %>
  </div>
<% end %>

:

在控制器或视图中放置大量逻辑;考虑在BoSsPo选址模型上创建<代码>发现?< /代码>方法。这样,您就可以遍历
@boss\u位置
,并对每个位置调用
discovered?

  <% @boss_locations.each do |bl| %>
    <div>
      <%= "#{bl.name}: #{bl.discovered?(current_user)}" %>
    </div>
  <% end %>

该方法可能如下所示:

class BossLocation < ActiveRecord::Base
  def discovered?(user)
    user.discovered_locations.map(&:boss_location).include?(self)
  end
end
class-BossLocation

我在上面发表了评论,你似乎很喜欢这个想法,所以我把它写了出来。

在控制器或视图中放进很多逻辑;考虑在BoSsPo选址模型上创建<代码>发现?< /代码>方法。这样,您就可以遍历
@boss\u位置
,并对每个位置调用
discovered?

  <% @boss_locations.each do |bl| %>
    <div>
      <%= "#{bl.name}: #{bl.discovered?(current_user)}" %>
    </div>
  <% end %>

该方法可能如下所示:

class BossLocation < ActiveRecord::Base
  def discovered?(user)
    user.discovered_locations.map(&:boss_location).include?(self)
  end
end
class-BossLocation

我在上面发表了评论,您似乎喜欢这个想法,所以我写了出来。

由于两个数组中的对象不相同,您可能需要以自定义方式进行迭代:

<% @boss_locations.each do |boss_location|
  <div>
    <%= boss_location.name %>:
    <%= @discovered_boss_locations.inject('Not Discovered') { |result, element| result = 'Discovered' if element.boss_location_id ==  boss_location.id}
  </div>
<% end %>

由于两个数组中的对象不相同,您可能需要以自定义方式进行迭代:

<% @boss_locations.each do |boss_location|
  <div>
    <%= boss_location.name %>:
    <%= @discovered_boss_locations.inject('Not Discovered') { |result, element| result = 'Discovered' if element.boss_location_id ==  boss_location.id}
  </div>
<% end %>


能否显示
@boss\u位置
@发现的
示例?这可能会有帮助:
[1,3,5]&[1,2,3]#=>[1,3]
发现的位置返回什么?这是一个
BossLocation
数组,还是一些通用的
Location
type.nash,这似乎是个好主意。唯一的问题是@boss_locations有boss locations,而discoverd主要有包括boss location的discovered locations。我编辑了丹尼,我同意你的观点,但是我认为你应该考虑在<代码> BassPosie模式(如果可能的话)创建一个<代码>发现/ <代码>方法。你完全正确。你能展示
@boss\u位置
@发现的
示例吗?这可能会有帮助:
[1,3,5]&[1,2,3]#=>[1,3]
发现的位置返回什么?这是一个
BossLocation
数组,还是一些通用的
Location
type.nash,这似乎是个好主意。唯一的问题是@boss_locations有boss locations,而discoverd主要有包括boss location的discovered locations。我编辑了丹尼,我同意你的观点,但是我认为你应该考虑在<代码> BassPosie模式(如果可能的话)创建一个<代码>发现/ <代码>方法。这可能是我将实现的thanx:)我只会改变发现?因为现在它知道太多关于被发现地点的信息了。它需要一些仔细的思考,但我认为这是最好的方式。是的,我非常喜欢这个想法,这可能是我将要实现的thanx:)我只会改变发现?因为现在它知道太多关于被发现地点的信息了。这需要仔细考虑,但我认为这是最好的办法。@SpyrosP我用一个使用
has\u many:through
的例子更新了我的答案。thanx Jonathan,这很好地结合了这两个答案,这绝对是我要使用的:)我更喜欢封装方法,但你认为它在性能方面更好吗?乍一看,这似乎是真的。@SpyrosP我不清楚。我将首先查看日志中生成的SQL。这可能是显而易见的。但总的来说,ActiveRecord的缓存使得在没有基准测试的情况下很难对性能进行推理。@SpyrosP我用一个使用
的例子更新了我的答案:通过
。thanx Jonathan,这很好地结合了这两个答案,这绝对是我要使用的:)我更喜欢封装方法,但你认为它在性能方面更好吗?乍一看,这似乎是真的。@SpyrosP我不清楚。我将首先查看日志中生成的SQL。这可能是显而易见的。但总的来说,ActiveRecord的缓存使得我们很难对性能进行w/o基准测试。