此作用域应处理传递的哈希中的可选键。当关键'组织'和'网站'存在,两者应该链接在一起。
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个键。
答案 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()