Rails и sql: переписывание find_by_sql

#sql #ruby-on-rails #find-by-sql

#sql #ruby-on-rails #поиск по sql

Вопрос:

У меня есть таблица Product и Creator, у меня также есть таблица под названием CreatorProduct, которая объединяет создателя с продуктом. У продукта может быть много создателей, а у создателя может быть много продуктов. Что я хочу сделать, так это найти продукты, у которых есть создатели, у некоторых продуктов может и не быть создателей.

Я написал приведенный ниже код, но как мне написать его более удобным для rails способом? Это работает для моей консоли в rails, но когда я помещаю это в свой код, я получаю неопределенный метод `includes’ для #

 Product.find_by_sql("select * from Products where id in (select product_id from Creator_Products intersect select id from Products)")
  

Спасибо!

Ответ №1:

Я бы, вероятно, просто использовал функцию find и использовал аналогичное where тому, что у вас есть сейчас:

Product.find(:all, :conditions => ["exists (select * from Creators where product_id = Products.Id)"])

В противном случае, я думаю, что с помощью способа, которым active record объединяет данные, вы, вероятно, могли бы получить то же самое, включив информацию о создателе (при условии, что у вас настроен has_many), а затем убедитесь, что информация о создателе существует…

Product.find(params[:id],:include => [:Creator],:conditions => ["Creator.product_id!=null"])

Если у вас еще не установлены отношения, которые вам нужно определить в ваших моделях:

 class Product< ActiveRecord::Base
has_many :CreatorProduct
has_many :Creators, :through => :CreatorProduct