2011-10-18 36 views
4

我有一組稱爲任務和帖子的資源,並且存在has_and_belongs_to_many(HABTM)關係。Ruby/Rails - 檢查子對象是否存在於HABTM關係記錄中

還有一個連接表連接它們的值。

create_table 'posts_tasks', :id => false do |t| 
    t.column :post_id, :integer 
    t.column :task_id, :integer 
end 

所以我的問題是如何檢查特定任務的ID是否存在於從@ post.tasks創建的數組中?

irb(main):011:0> @post = Post.find(1) 
=> #<Post id: 2, comment: "blah blah", created_at: "2011-10-18 03:40:30", updated_at: 
irb(main):012:0> @post.tasks 
=> [#<Task id: 1, description: "Test 1", created_at: "2011-10-18 03: 
    22:05", updated_at: "2011-10-18 03:22:05">, #<Task id: 3, description: "Test 3", 
    created_at: "2011-10-18 03:22:21", updated_at: "2011-10-18 03:22:21 
    ">] 

所以我的問題是什麼寫作的紅寶石的方式做「@task = Task.find(2)」內部存在@ post.tasks如果這樣返回true或false?

回答

8
​​

其中task_id是您要檢查的任務的ID。爲了解釋這一點,你需要獲取任務列表,將它們映射到它們的ID的數組,然後檢查所查詢的ID是否在該數組中。如果你不熟悉map你應該檢查出來,這很棒。

ruby-docs

+0

只是想指出,這不一定是最好的答案。做到這一點的正確方法取決於你已經加載的數據以及你打算詢問的未來問題。數據庫查詢很貴!儘量減少它們。 – GabeIsman

11
@post.tasks.where(:id => task_id).present? 

相比有什麼Gabelsman曾建議要輕得多。

+1

這使得'n'查詢你是否正在檢查'n'任務。但仍然比接受的答案更好。 –

+1

它不是必須的。你可以傳遞一個'task_ids'數組。 – Chirantan

3

假設你命名你的has_and_belongs_to_many:posts然後做這樣的事情在Rails中非常優化:

@post.task_ids.include?(task.id)

我注意到,這裏提供的兩個答案導致n select語句。但是用task_ids緩存第一個查詢,其餘的不需要DB中的SELECT語句。

1

可以使用exists?方法爲:

@post.tasks.exists?(id: task_id)