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基准测试。