Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从两个数据源创建哈希最优雅的方法_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 从两个数据源创建哈希最优雅的方法

Ruby on rails 从两个数据源创建哈希最优雅的方法,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我有一个building_表和api::building_表,我希望将building_表中的数据作为默认值,但如果building_表中不存在该数据,我希望必须在api::building_表中获取该数据。 问题是有些属性可能不存在于building_表中,但存在于api building_表中。每个表中还有不同名称的列 这是我的示例代码 def get_building_info building = Building.find_by(id: params[:id]) api_bui

我有一个building_表和api::building_表,我希望将building_表中的数据作为默认值,但如果building_表中不存在该数据,我希望必须在api::building_表中获取该数据。 问题是有些属性可能不存在于building_表中,但存在于api building_表中。每个表中还有不同名称的列

这是我的示例代码

def get_building_info
  building = Building.find_by(id: params[:id])
  api_building = Api::Building.find_by(id: params[:id])
  building_hash = {}
  building_hash[:name] = building.name || api_building.name
  building_hash[:room] = building.room || api_building.room
  building_hash[:rent] = building.rent || api_building.monthly_fee
...
end

有没有更优雅的方法?顺便说一句,这在我的控制器中。

可能存在许多解决方案来实现这一点,但是,这里有一个更简单的解决方案:

def get_building_info
  building = Hash.new
  building[:name], building[:room] = desired_building.name, desired_building.room 
end

private

 def desired_building
    Building.find_by(id: params[:id]) || 
    Api::Building.find_by(id: params[:id])
 end

可能存在许多解决方案来实现这一点,但这里有一个更简单的解决方案:

def get_building_info
  building = Hash.new
  building[:name], building[:room] = desired_building.name, desired_building.room 
end

private

 def desired_building
    Building.find_by(id: params[:id]) || 
    Api::Building.find_by(id: params[:id])
 end

我认为您的方法是正确的,但是
building
变量将被覆盖,您需要定义一个新变量,如
building2={}

我认为您这样做是正确的,但是
building
变量将被覆盖,您需要定义一个新变量,如
before_action :find_records, only: :get_building_info

def get_building_info
  building_hash = {}
  building_hash[:name] = building_name
  building_hash[:room] = building_room
  # OR
  building_hash[:name], building_hash[:room] = building_name, building_room

end

private

def find_records
  @building = Building.find_by(id: params[:id])
  @api_building = Api::Building.find_by(id: params[:id])
end

def building_name
  @building.name || @api_building.name
end

def building_room
  @building.room || @api_building.room
end

building2={}

接受键列表作为参数的通用方法:

before_action :find_records, only: :get_building_info

def get_building_info
  building_hash = {}
  building_hash[:name] = building_name
  building_hash[:room] = building_room
  # OR
  building_hash[:name], building_hash[:room] = building_name, building_room

end

private

def find_records
  @building = Building.find_by(id: params[:id])
  @api_building = Api::Building.find_by(id: params[:id])
end

def building_name
  @building.name || @api_building.name
end

def building_room
  @building.room || @api_building.room
end
def get_building_info(keys = %i[name room rent].zip(%i[name room fee]))
  building = Building.find_by(id: params[:id])
  api_building = Api::Building.find_by(id: params[:id])
  keys.map do |key, api_key|
    [
      key,
      building.attributes[key.to_s] || api_building.attributes[api_key.to_s]
    ]
  end.to_h
end

接受键列表作为参数的通用方法:

def get_building_info(keys = %i[name room rent].zip(%i[name room fee]))
  building = Building.find_by(id: params[:id])
  api_building = Api::Building.find_by(id: params[:id])
  keys.map do |key, api_key|
    [
      key,
      building.attributes[key.to_s] || api_building.attributes[api_key.to_s]
    ]
  end.to_h
end
您可以使用:

您可以使用:



问题是某个属性可以从api构建中获取,但这并不意味着其他属性也将从api构建中获取。您没有得到OPYou的问题问题是某个属性可以从api构建中获取,但这并不意味着其他属性也将从api构建中获取。您没有得到OPYou的问题没有得到OPI的问题,对不起,我只是在浏览器中键入了它,它是一个打字错误!你们并没有得到OPI的问题,对不起,我只是在浏览器中输入了它,它是一个打字错误!嗨,谢谢你的回答。我的建筑模型是由12根柱子组成的,你认为将其中12根柱子单独放置是一种好的做法吗?不,不是,。我以为你只有两个参数为什么没有?您可能很容易生成所有这些方法,因此所有12个方法都需要5行。@AlekseiMatiushkin但是12个私有方法,我认为您的解决方案比我的要好得多。您好,谢谢您的回答。我的建筑模型是由12根柱子组成的,你认为将其中12根柱子单独放置是一种好的做法吗?不,不是,。我以为你只有两个参数为什么没有?您可能很容易生成所有这些方法,因此所有12个方法都需要5行。@AlekseiMatiushkin但是12个私有方法,我认为您的解决方案比我的要好得多。我的问题似乎缺少更多细节,对不起!我也想到了这一点,但我的表列有不同的名称。对不起,我没有把它包括在我的问题中!更新了答案。我不接受get_building_info的参数的原因是因为这是一个ajax查询,所以我只有id作为building的参数。我不确定我是否遵循。上面的方法完全符合您的要求,并且完全可以在不传递任何参数的情况下调用它。正如你可能看到的,它有一个参数的默认值。我的问题似乎缺少更多的细节,对不起!我也想到了这一点,但我的表列有不同的名称。对不起,我没有把它包括在我的问题中!更新了答案。我不接受get_building_info的参数的原因是因为这是一个ajax查询,所以我只有id作为building的参数。我不确定我是否遵循。上面的方法完全符合您的要求,并且完全可以在不传递任何参数的情况下调用它。正如你可能看到的,它有一个参数的默认值。我认为有一些“聪明”的解决方案被建议,但你的方法很容易阅读和理解,你应该坚持。我认为有一些“聪明”的解决方案被建议,但你的方法很容易阅读和理解,你应该坚持。