范围内的条件链接

时间:2017-02-08 15:57:12

标签: ruby-on-rails

此作用域应处理传递的哈希中的可选键。当关键'组织'和'网站'存在,两者应该链接在一起。

scope :search_provider, lambda { |search|
  if search['organisation'].present?
    where("name COLLATE utf8_general_ci LIKE ?", "%#{search['organisation']}%")
  end
  if search['website'].present?
    where("website COLLATE utf8_general_ci LIKE ?", "%#{search['website']}%")
  end
}

但不幸的是,这并没有发生:

Provider.search_provider({'website' => 'Hello'}).to_sql
 => "SELECT `provider`.* FROM `providers`  WHERE (website COLLATE utf8_general_ci LIKE '%Hello%')"

[OK]

Provider.search_provider({'organisation' => 'Hello'}).to_sql
 => "SELECT `provider`.* FROM `providers`"

[WRONG]

Provider.search_provider({'website' => 'Hello', 'organisation' => 'huhu'}).to_sql
 => "SELECT `provider`.* FROM `providers`  WHERE (website COLLATE utf8_general_ci LIKE '%Hello%')"

[WRONG]

仅使用最后一个where(网站),并且第一个where(组织)丢失。我想问题是缺少其他情况......我用where(nil)试了一下,但它没有用。

我该如何解决?

修改

我可以使用像

这样的条件
if search['organisation'].present? && search['website'].present? 
  ... 
elsif search['organisation'].present?
  ... 
elsif search['website'].present? 
  ...

但是我想在哈希中插入更多的键,条件语句会变得很大,需要考虑6或7个键。

2 个答案:

答案 0 :(得分:1)

or实际上只是用于声明类方法的语法糖。当它不适合整齐的小单行时,请不要使用scope

如果将其声明为正式类方法,则其结构更加简单。

scope

您可以使用哈希上的def self.search(**kwargs) kwargs.compact.each_with_object(self.all) do |(key, value), memo| memo.where( "? COLLATE utf8_general_ci LIKE ?", key.to_s, value ) end end #permit从控制器中调用它。

#slice

答案 1 :(得分:1)

你可以在这里使用这样的范围:

db_engine = sqlalchemy.create_engine("mysql+pymysql://user:pass@host/database")
cnx = db_engine.connect()
table = pd.read_sql('select * from my_table',cnx)
cnx.close()