Ruby on rails 在数组或附加表中存储值

Ruby on rails 在数组或附加表中存储值,ruby-on-rails,arrays,ruby,database,database-design,Ruby On Rails,Arrays,Ruby,Database,Database Design,我正在rails 5.1中为酒店开发一个预订系统,而每晚的价格取决于入住时间。好的,基本上这是一个与数据库设计相关的问题,我想听听您对哪个选项的看法: 选项A:我只需继续,将价格保存在我的房间表格中的一个数组中,以便: price_increments = [1_day,2_days,...,n_days] = [80,65,...,x] def booking days = (end_date - start_date).to_i price = price_incremen

我正在rails 5.1中为酒店开发一个预订系统,而每晚的价格取决于入住时间。好的,基本上这是一个与数据库设计相关的问题,我想听听您对哪个选项的看法:

选项A:我只需继续,将价格保存在我的房间表格中的一个数组中,以便:

price_increments = [1_day,2_days,...,n_days] = [80,65,...,x]
def booking
    days = (end_date - start_date).to_i
    price = price_increments.at(days)
    total = price * days
end
然后,我可以通过传递停留时间来访问此阵列,以便:

price_increments = [1_day,2_days,...,n_days] = [80,65,...,x]
def booking
    days = (end_date - start_date).to_i
    price = price_increments.at(days)
    total = price * days
end
选项B:我创建了一个额外的价格表,但是我不太确定如何访问与持续时间相关的价格,特别是因为应用程序应该是一个包含多家酒店的平台


你觉得怎么样?选择A是省钱还是选择B?什么是最佳做法?感谢您的任何建议:)

有一个很好的理由,您应该开发您的逻辑价格增量记录:我们需要知道它是正常价格还是主要价格。 不管怎样,我认为在保存记录之前,都可以使用
before\u save

def Booking < ActiveRecord::Base
    before_save :init
    PRICE_INCREMENT = [one, two, three, four]

    def init
        self.duration ||= (end_date - start_date).to_i
        self.price    ||= duration * PRICE_INCEREMENT[duration]
    end
 end
def预订
有一个很好的理由,您应该开发您的逻辑价格增量记录:我们需要知道它是常规价格还是主要价格。 不管怎样,我认为在保存记录之前,都可以使用
before\u save

def Booking < ActiveRecord::Base
    before_save :init
    PRICE_INCREMENT = [one, two, three, four]

    def init
        self.duration ||= (end_date - start_date).to_i
        self.price    ||= duration * PRICE_INCEREMENT[duration]
    end
 end
def预订
“如何访问与工期相关的价格”-只需将价格与工期一起存储,即
价格:80天:1
价格:65天:2
等。如选项B中所述,创建附加表时一样?但你是对的。这样我也可以轻松地访问价格。相应的查询是:price=price.where(“room\u ID=?AND days=?,params[:room\u ID],params[:duration])就最佳实践而言,拥有更多的表通常比使用序列化列更好,因为它可以让您的数据库完成工作。例如,一个用户想要住5晚,但他们不想每晚支付超过50英镑。使用选项A,您需要实例化每个记录,以便能够检查其5晚的价格,而使用选项B,您可以只需一个SQL查询即可。@Luke您可以将其写为
Price.where(room\u id:params[:room\u id],days:params[:duration])
-您不需要将其写在SQL表单中。EDIT:尽管在房间模型上将其设置为关联可能更好,所以您可以只执行
room.prices.where(days:params[:duration])
”如何获取与工期相关的价格“–只需将价格与持续时间一起存储,即
价格:80天,天数:1
价格:65天,天数:2
等,如创建选项B中所述的附加表格一样?”?但你是对的。这样我也可以轻松地访问价格。相应的查询是:price=price.where(“room\u ID=?AND days=?,params[:room\u ID],params[:duration])就最佳实践而言,拥有更多的表通常比使用序列化列更好,因为它可以让您的数据库完成工作。例如,一个用户想要住5晚,但他们不想每晚支付超过50英镑。使用选项A,您需要实例化每个记录,以便能够检查其5晚的价格,而使用选项B,您可以只需一个SQL查询即可。@Luke您可以将其写为
Price.where(room\u id:params[:room\u id],days:params[:duration])
-您不需要将其写在SQL表单中。EDIT:尽管在房间模型上将其设置为关联可能更好,所以您可以只执行
room.prices.where(days:params[:duration])