选择记录在ID列表中作为属性存储的ID

时间:2018-07-30 14:58:24

标签: mysql ruby-on-rails ruby

我将这些保存到数据库LocationsServices中的表中

每个Location记录都有一个名为location_ids的属性,该属性是用逗号分隔的ID *列表。

*我之所以这样表示我的多对多关系,是因为我有许多类似于Services的表,并且不想拥有大量的链接表

我的桌子

CREATE TABLE services (
  id bigint(20) UNSIGNED NOT NULL,
  location_ids varchar(255) DEFAULT NULL,
  image varchar(255) DEFAULT NULL,
  created_at timestamp NULL DEFAULT NULL,
  created_by bigint(20) UNSIGNED NOT NULL DEFAULT '0',
  updated_at timestamp NULL DEFAULT NULL,
  updated_by bigint(20) UNSIGNED DEFAULT NULL
);

CREATE TABLE locations (
  id bigint(20) UNSIGNED NOT NULL,
  street1 varchar(255) DEFAULT NULL,
  street2 varchar(255) DEFAULT NULL,
  city varchar(255) DEFAULT NULL,
  province varchar(255) DEFAULT NULL,
  country varchar(255) DEFAULT NULL,
  postal_code varchar(255) DEFAULT NULL,
  phone1 varchar(45) DEFAULT NULL,
  phone2 varchar(45) DEFAULT NULL,
  fax varchar(255) DEFAULT NULL,
  email varchar(255) DEFAULT NULL,
  twitter_url varchar(255) DEFAULT NULL,
  facebook_url varchar(255) DEFAULT NULL,
  created_at timestamp NULL DEFAULT NULL,
  created_by bigint(20) UNSIGNED NOT NULL DEFAULT '0',
  updated_at timestamp NULL DEFAULT NULL,
  updated_by bigint(20) UNSIGNED DEFAULT NULL
);

我正在尝试检索所有Services,其中某个特定位置的ID(从我的参数中获取)位于该location_ids属性中。

这是我所拥有的查询(不起作用),它可以使我试图检索的内容更加清楚

Admin::Service.where("#{params[:location_id]} in (services.location_ids)")

* params [:location_id]将是当前位置的ID

任何帮助将不胜感激!

更新

我结束了在数据库中添加5个链接表的工作,这使它更容易通过Rails访问。 谢谢大家的帮助

2 个答案:

答案 0 :(得分:0)

我同意@spickermann。我强烈建议您使用has_and_belongs_to_many或has_many:through关系。无论如何,我认为这应该可行(不推荐)。

Admin::Service.all.select{ |service| 
    service.location_ids.split(',').map(&:to_i).include?(params[:location_id])
}

答案 1 :(得分:0)

我最终在数据库中添加了链接表。添加它们所需的工作远远少于使我稍后在项目中完成的工作。

我使用过的示例

对于我的服务,我创建了一个名为location_services的表,其属性为IDlocation_idservice_id。 在我的Rails服务模型中,我做到了

在我的服务模型中

class Service < ApplicationRecord
    has_many location_services, dependent: :destroy
    has_many :locations, through: :location_services
    accepts_nested_attributes_for :location_services
end

在我的LocationService模型中

class LocationService < ApplicationRecord
     belongs_to :location, optional: true
     belongs_to :service, optional: true
end

在我的位置信息模型中

class Location < ApplicationRecord
    has_many :location_services, dependent: :destroy
    has_many :services, through: :location_services
end

然后,我对与locations表有多对多关系的每个表重复这些步骤