0

我在遇到以下查詢時遇到了問題。我不知道爲什麼。Ruby on Rails,SQL Server查詢

這是用戶模式:

class UserProfile < ActiveRecord::Base 

    self.table_name = "UserProfile" 
    self.primary_key = "UserId" 

    has_many :user_access_job_list, class_name: 'UserAccessJobList', foreign_key: 'UserId' 
    has_many :job_tables, class_name: 'JobTable', through: :user_access_job_list 
    has_many :order_histories, class_name: 'OrderHist', through: :job_tables 
    has_many :order_hist_lines, class_name: 'OrderHistLine', through: :job_tables 
    has_many :delivery_histories, class_name: 'DeliveryHist', through: :job_tables  

end 

這是訂單項歷史模式:

class OrderHistLine < ActiveRecord::Base 

    self.table_name = "OrderHistLine" 
    self.primary_key = "WebLineId" 

    belongs_to :job_table, class_name: 'JobTable', foreign_key: 'JobId' 
    belongs_to :job_product, class_name: 'JobProduct', foreign_key: 'ItemId' 
    belongs_to :order_hist, class_name: 'OrderHist', foreign_key: 'WebOrderId' 
    has_many :delivery_histories, class_name: 'DeliveryHist', foreign_key: 'WebLineId' 

end 

我想查詢訂單項歷史記錄一個特定的產品名稱。 ItemFreeTxt是產品名稱的作業產品中的列的名稱。 我使用下面的查詢:

@user.order_hist_lines.joins(:job_product).where(ItemFreeTxt: "xxxxxxxxxxx") 

這給我的錯誤:

ActiveRecord::StatementInvalid: TinyTds::Error: Invalid column name 'ItemFreeTxt'.: EXEC sp_executesql N'SELECT [OrderHistLine].* FROM [OrderHistLine] INNER JOIN [JobProduct] ON [JobProduct].[ItemId] = [OrderHistLine].[ItemId] INNER JOIN [JobTable] ON [OrderHistLine].[JobId] = [JobTable].[JobId] INNER JOIN [UserAccessJobList] ON [JobTable].[JobId] = [UserAccessJobList].[JobId] WHERE [UserAccessJobList].[UserId] = @0 AND [OrderHistLine].[ItemFreeTxt] = N''1''', N'@0 nvarchar(10)', @0 = N'LamCK' 

然而,當我搜索使用使用項目Id,而不是產品名稱的搜索我的作品。

@user.order_hist_lines.joins(:job_product).where(ItemId: "SI000110") 

我可以從下列查詢獨特的產品名稱和項目ID沒有任何問題:

@user.order_hist_lines.includes(:job_product).pluck(:ItemId).uniq 
@user.order_hist_lines.includes(:job_product).pluck(:ItemFreeTxt).uniq 

所以我不知道爲什麼我不能查詢的ItemFreeTxt不工作。任何意見或幫助,不勝感激。非常感謝你提前。讓我知道是否需要提供更多信息。

回答

1

您需要將表名添加到查詢:

@user.order_hist_lines.joins(:job_product). 
    where(JobProduct: { ItemFreeTxt: "xxxxxxxxxxx" }) 
+1

它給我這個錯誤:的ActiveRecord :: StatementInvalid:TinyTds ::錯誤:多部分標識符「job_product.ItemFreeTxt」不能EXEC sp_executesql N'SELECT [OrderHistLine]。* FROM [OrderHistLine] INNER JOIN [JobProduct] ON [JobProduct]。[ItemId] = [OrderHistLine]。[ItemId] INNER JOIN [JobTable] ON [OrderHistLine]。[JobId ] = [JobTable]。[JobId] INNER JOIN [UserAccessJobList] ON [JobTable]。[JobId] = [UserAccessJobList]。[JobId] WHERE [UserAccessJobList]。[UserId] = @ 0 AND [Job_product]。[ItemFreeTxt] = N'WW 20/20D,75 PFA(MAX。W/C 0.60)''',N'0 nvarchar(10)',@ 0 = N'LamCK' –

+0

任何想法是什麼錯誤? –

+0

@ShinonChan:由於表名不符合Rails的約定,所以錯誤信息有點難以理解。我更新了答案中的where子句。散列結構取決於表名。 – spickermann