Ruby / Rails - 检查HABTM关系记录中是否存在子ID

时间:2011-10-18 03:29:35

标签: ruby-on-rails ruby has-and-belongs-to-many

我有一组称为“任务”和“帖子”的资源,并且彼此之间存在has_and_belongs_to_many(HABTM)关系。

还有一个连接表来连接它们的值。

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

所以我的问题是如何检查从@ post.tasks创建的数组中是否存在特定任务的id?

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?

4 个答案:

答案 0 :(得分:13)

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

与Gabelsman建议的相比要轻得多。

答案 1 :(得分:9)

@post.tasks.map(&:id).include?(task_id)

其中task_id是您要检查的任务的ID。为了解释这一点,您将获取任务列表,将它们映射到其ID数组,然后检查有问题的ID是否在该数组中。如果你不熟悉map,你应该检查一下,这很棒。

ruby-docs

答案 2 :(得分:3)

假设您将has_and_belongs_to_many命名为:posts,那么在Rails中执行此类操作非常优化:

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

我注意到这里提供的两个答案会产生n个选择语句。但是使用task_ids执行此操作会缓存第一个查询,其余查询不需要来自数据库的SELECT语句。

答案 3 :(得分:1)

您可以使用exists?方法:

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