Ruby on rails 我想把我的数据库查找表映射到一个散列,好吗?

Ruby on rails 我想把我的数据库查找表映射到一个散列,好吗?,ruby-on-rails,database-design,lookup-tables,Ruby On Rails,Database Design,Lookup Tables,我正在开发一个Rails web应用程序,对如何在模型中利用查找表值感到困惑。以下是我的应用程序中的示例模型: table name: donations id amount note user_id appeal_id donation_status_id donation_type_id is_anonymous created_at updated_at 字段*捐赠\状态\标识*和*捐赠\类型\标识*指的是查找表。因此,在我的代码中,我有几个随机的地方,我可以这样调用: my_dona

我正在开发一个Rails web应用程序,对如何在模型中利用查找表值感到困惑。以下是我的应用程序中的示例模型:

table name: donations

id
amount
note
user_id
appeal_id
donation_status_id
donation_type_id
is_anonymous
created_at
updated_at
字段*捐赠\状态\标识*和*捐赠\类型\标识*指的是查找表。因此,在我的代码中,我有几个随机的地方,我可以这样调用:

my_donation = Donation.find(params[:id])
if my_donation.donation_status_id == DonationStatus.find_by_name("completed").id
#do something
end
class DonationStatus < ActiveRecord::Base
  COMPLETED_DONATION_ID = DonationStatus.find_by_name("completed").id
  PENDING_DONATION_ID   = DonationStatus.find_by_name("pending").id
  # ...
end

class DonationsController < ApplicationController
  def some_action
    my_donation = Donation.find(params[:id])
    if my_donation.donation_status_id == DonationStatus::COMPLETED_DONATION_ID
    #do something
  end
end
COMPLETED_DONATION_ID = DonationStatus.find_by_name("completed").id rescue "Can't find 'completed' in donation_statuses table"
在我经验不足的人看来,一次性查询DonationStatus表在这里似乎非常浪费,但我看不到任何其他好方法。我想到的第一个想法是在应用程序启动时将我所有的查找表读入一个散列,然后在需要时对其进行查询。 但是有没有更好的方法来做我想做的事情呢?我不应该担心这样的问题吗?
谢谢

您可以将此方法添加到
捐赠中

# Donation.rb
def completed?
    self.donation_status.name == 'completed' ? true : false
end
然后做我的捐赠。完成了吗?。如果这是第二次调用,Rails将查找缓存而不是数据库

如果需要,您可以添加memcached,或者进一步使用Rails的缓存,并执行以下操作:

def completed?
    return Rails.cache.fetch("status_#{self.donation_status_id}_complete") do
        self.donation_status.name == 'completed' ? true : false
    end
end

这样做的目的是创建一个名为(例如)“status_1_complete”的散列键,如果第一次未定义该散列键,则对该块求值并设置值。否则,它将只返回值。这样,如果你有100000000个捐款,并且每个捐款都有捐款状态1,它将直接进入缓存。memcached速度很快,很受欢迎。

把它放在一个常量中怎么样?例如,类似这样的内容:

my_donation = Donation.find(params[:id])
if my_donation.donation_status_id == DonationStatus.find_by_name("completed").id
#do something
end
class DonationStatus < ActiveRecord::Base
  COMPLETED_DONATION_ID = DonationStatus.find_by_name("completed").id
  PENDING_DONATION_ID   = DonationStatus.find_by_name("pending").id
  # ...
end

class DonationsController < ApplicationController
  def some_action
    my_donation = Donation.find(params[:id])
    if my_donation.donation_status_id == DonationStatus::COMPLETED_DONATION_ID
    #do something
  end
end
COMPLETED_DONATION_ID = DonationStatus.find_by_name("completed").id rescue "Can't find 'completed' in donation_statuses table"

因为您有两个模型,所以在构建模型时应该使用ActiveRecord模型关联

class Donation
  has_one :donation_status
end

class DonationStatus
 belongs_to :donation
end
那么当你这么做的时候

my_donation = Donation.find(params[:id])
if my_donation.donation_status.status_name == 'complete'
  #do something
end

有关更多信息,您可能想了解rails是如何做的模型协会不必担心性能,rails已经为您解决了这一问题,如果您遵循应该如何做的话

我想这可能是我想要的解决方案,但为了使它发挥作用,我必须进行捐赠(属于:捐赠状态)和捐赠状态(有很多:捐赠)——然后我可以调用d=generation.find(params[:id],:include=>[:generation\u status])我需要的所有东西都预加载到对象中,因此我可以调用d.generation\u status.name=='completed'是的,使用include是一种方法。我会将常量命名为completed,而不是completed\u generation\u ID,但除此之外,这是一种有效的方法,我不确定它为什么会被否决……特别是因为OP希望避免第二次投票呃,这是,但选择的答案不是。