MrW*_*ter 9 ruby sql conditional ruby-on-rails rails-activerecord
我是一个铁杆新手,我正试图在带有rails的桌子上进行搜索,而我只是使用我的sql知识来做到这一点.但这似乎不像铁路或红宝石甚至......
有没有更好的方法来做我在下面做的事情?(基本上,只有在填充时才将日期参数传递给sql)
def search(begin_date=nil, end_date=nil)
subject = " and created_at "
if !(begin_date.nil? || end_date.nil?)
where_part = subject + "BETWEEN :begin_date AND :end_date"
else if (begin_date.nil? && end_date.nil?)
where_part = ""
else if(begin_date.nil?)
where_part = subject + " <= :end_date"
else if (end_date.nil?)
where_part = subject + " >= :begin_date"
end
end
end
end
User.joins(places: {containers: {label: :user}}).where("users.id= :user_id "+where_part, user_id: self.id, begin_date:begin_date, end_date:end_date).group(...).select(...)
end
Run Code Online (Sandbox Code Playgroud)
编辑
user.rb
has_many :containers
has_many :user_places
has_many :places, through: :user_places
has_many :labels
Run Code Online (Sandbox Code Playgroud)
place.rb
has_many :containers
has_many :user_places
has_many :users, through: :user_places
Run Code Online (Sandbox Code Playgroud)
container.rb
belongs_to :label
belongs_to :place
belongs_to :user
Run Code Online (Sandbox Code Playgroud)
label.rb
belongs_to :user
has_many :containers
Run Code Online (Sandbox Code Playgroud)
基本上,我希望计算给定用户标签内容器数量或每个位置的直接关系,并希望能够按开始和结束日期对其进行过滤.
这个日期中的任何一个都可能是零,所以我需要在我的"查询"中解决这个问题.
我的问题是:我怎样才能以轨道方式做到这一点?我看了一下http://guides.rubyonrails.org/active_record_querying.html,也许我可以在某处使用except命令...但是这个关系模型看起来有点复杂,用ActiveRecord做这个...怎么可能我?,我真的认为我应该使用ActiveRecord,但是怎么样?
谢谢
mu *_*ort 20
您可以where
对查询应用多个调用,以便构建基本查询:
query = User.joins(...)
.group(...)
.select(...)
.where('users.id = :user_id', :user_id => self.id)
Run Code Online (Sandbox Code Playgroud)
然后where
根据您的日期间隔添加另一个调用:
if(begin_date && end_date)
query = query.where(:created_at => begin_date .. end_date)
# or where('created_at between :begin_date and :end_date', :begin_date => begin_date, :end_date => end_date)
elsif(begin_date)
query = query.where('created_at >= :begin_date', :begin_date => begin_date)
elsif(end_date)
query = query.where('created_at <= :end_date', :end_date => end_date)
end
Run Code Online (Sandbox Code Playgroud)
每个where
调用使用AND为您的整体WHERE子句添加另一个部分,例如:
q = M.where(a).where(b).where(c)
Run Code Online (Sandbox Code Playgroud)
就像说的一样WHERE a AND b AND c
.