Сравните значения из двух запросов и верните совпадающие значения в Ruby - PullRequest
0 голосов
/ 31 мая 2019

Мне нужно получить идентификаторы модели из двух отдельных запросов и проверить, присутствуют ли одинаковые идентификаторы в обоих запросах.Если нет, то я должен передать строку Not present, где это не так, иначе я должен передать значение.

class Purchase
    belongs_to :customer
    belongs_to :selected_items

class SelectedItem
    has_many :purchases
    has_many :sub_categories
    has_many :categories, through: :sub_categories

class SubCategory
    belongs_to :selected_item
    belongs_to :categories 

class Category
    has_many :sub_categories
    has_many :selected_items, through: :sub_categories

class Customer
    has_many :purchases
selected_items = @category.selected_items

def get_values(customer, selected_items)
    purchases = Purchase.where(customer_id: customer.id)
    selected_items_ids = selected_items.collect { |selected_item| selected_item.id }
    purchased_selected_items_ids = purchases.collect { |purchase| purchase.selected_item_id }
    both_present = selected_items_ids & purchased_selected_items_ids
    # after this how can I send "Not purchased" string for whichever id is not present or send the send the purchased item name wherever ids present in both?

В методе get_values мне нужно сравнить idsSelectedItem между purchases и selected_items.Если id любого элемента в selected_item находится в любом элементе в purchases, тогда я должен вернуть purchased, если нет, то purchase для этого selected_item не будет в базе данных, то есть он вернетсяblank в запросе.Тогда я должен вернуть Not purchased строку.Это делается для каждого клиента.Как я могу это сделать?Здесь я отображаю результаты в таблице в файле erb.Таким образом, столбцы для каждого selected_item будут созданы.Я должен передать значения того, купил ли каждый клиент или нет для каждого из selected_item.

Ответы [ 3 ]

0 голосов
/ 31 мая 2019
def get_values(customer, selected_items)
  purchases = Purchase.where(customer_id: customer.id)
  selected_items_ids = selected_items.collect { |selected_item| selected_item.id }
  purchased_selected_items_ids = purchases.collect { |purchase| purchase.selected_item_id }
  purchased = selected_items_ids & purchased_selected_items_ids
  not_purchased = (selected_items_ids - purchased_selected_items_ids) + 
                (purchased_selected_items_ids - selected_items_ids)
end

Думаю, теперь вы сможете вернуть как купленные, так и не купленные предметы.Вы можете просто вернуть массив [купленный, не_купленный], где и купленный, и не_купленный будут массивом и содержат соответствующие идентификаторы, или вы можете перебирать их и создавать хэш с идентификатором в качестве ключа, а значением будет item_name (для приобретенных идентификаторов) / not_purchased(для других идентификаторов) и верните хеш.

0 голосов
/ 31 мая 2019

Вероятно, лучше оставить SQL, чтобы вы обрабатывали всю ситуацию, когда вы хотите найти купленные и не купленные предметы, например,

  purchase_table = Purchase.arel_table
  selected_items_table = SelectedItems.arel_table
  SelectedItems.joins(:sub_categories).joins(
      purchase_table.join(selected_items_table,Arel::Nodes::OuterJoin).on(
          selected_items_table[:id].eq(purchase_table[:selected_item_id]).and(
            purchase_table[:customer_id].eq(customer.id))
      ).join_sources)
  .where(sub_categories: {category_id: @category.id}).select( 
      "selected_items.*, 
       Case 
         WHEN purchases.id IS NULL Then 'Not Purchased' 
         ELSE 'Purchased' 
       END AS purchasing_status"
   ) 

Это должно привести к следующему:

  SELECT 
    selected_items.*, 
    Case 
      WHEN purchases.id IS NULL Then 'Not Purchased' 
      ELSE 'Purchased' 
    END AS purchasing_status
  FROM 
    selected_items
    INNER JOIN sub_categories ON sub_categories.selected_item_id = selected_items.id
    LEFT OUTER JOIN purchases ON purchases.selected_item_id = selected_items.id
       AND purchases.customer_id = [YOU CUSTOMER ID] 
  WHERE 
     sub_categories.category_id = [YOUR CATEGORY ID] 

Однако это чрезвычайно странная схема, поскольку я предположил бы, что Заказчик сделает выбор, который в конечном итоге может быть приобретен, и что этот выбор будет принадлежать подкатегории.например,

class Customer
  has_many :selected_items
  has_many :purchases, through: :selected_items

class Purchase
  belongs_to :selected_item

class SelectedItem
  belongs_to :customer
  belongs_to :sub_category
  has_one :purchase

class SubCategory
  belongs_to :category
  has_many :selected_items

class Category
  has_many :sub_categories
  has_many :selected_items, through: :sub_categories

В этой схеме было бы намного легче определить, был ли SelectedItem для Customer Purchase d или нет

0 голосов
/ 31 мая 2019

Вы можете сделать как,

selected_items  = @category.selected_items

def get_values(customer, selected_items)
    purchases = Purchase.where(customer_id: customer.id)
    result = selected_items & purchases # will give common
    result.nil? ? "not_puchased" : "purchased"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...