2011-05-22 37 views
0

想想這些代碼行:的Ruby/Rails的方法來檢查,如果在Array對象在其他數組存在

@boss_locations = BossLocation.order('min_level asc').all 
@discovered = current_user.discovered_locations.includes(:boss_location).all 

第一個得到所有可用的老大位置。第二個,獲取所有發現的用戶位置(user_id,boss_location_id),還包含boss_location對象。

現在,在我看來,我想根據@discovered上是否存在老闆位置來呈現每個老闆的位置和「發現」或「未發現」等消息。

現在,我的問題是如何以簡單的方式提供我的視圖來做到這一點。我可以遍歷這兩個數組,但我很確定這不是更好的方法。也許有一種很好的方式根據爲用戶發現的老闆位置來映射所有老闆的位置。你會怎麼做?

編輯 - 變量有:

@boss_locations:

=> [#<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">] 

@discovered:

=> [#<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">] 
+1

可以顯示'@ boss_locations'和'@ discovered'的例子嗎?可能會有幫助:'[1,3,5]&[1,2,3]#=> [1,3]' – 2011-05-22 06:09:01

+0

'discovered_locations'返回什麼?它是一個'BossLocation'的數組,還是一些通用的'Location'類型。 – dwhalen 2011-05-22 06:30:56

+0

納什,這似乎是一個好主意。唯一的問題是@boss_locations有老闆的位置,而發現的主要是發現了包含老闆位置的地點。我編輯說明thanx球員 – Spyros 2011-05-22 06:34:23

回答

1

要封裝您的數據模型更好的,你要修改模型類。

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 = BossLocation.order('min_level asc').all 

而在你的看法:

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

太棒了!當場表示感謝! – Spyros 2011-05-22 06:41:07

+0

@SpyrosP我用一個使用'has_many:through'的例子更新了我的答案。一探究竟。 – 2011-05-22 07:50:45

+0

thanx Jonathan,這個結合了很好的答案,並且絕對是我會用到的:) – Spyros 2011-05-22 07:57:14

3

這是一個很大的邏輯放在一個控制器或視圖;考慮在BossLocation模型上創建一個discovered?方法。這樣,你可以通過@boss_locations迭代,並呼籲各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 

我評論上面,你似乎很喜歡這個想法,所以我寫的出。

+0

是的,我喜歡這個想法很多,這可能是我將實施thanx :)我只會改變發現?因爲現在它知道發現地點太多了。這需要仔細思考,但我認爲這是最好的方式。 – Spyros 2011-05-22 07:25:18

0

正如在兩個數組中的對象是不相同的,則可能需要在自定義的方式來遍歷:

<% @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 %> 
相關問題