स्कॉप्स को शामिल करने वाली मॉडल चिंताओं का उपयोग करके, यह जानने के लिए सबसे अच्छा तरीका क्या है कि नेस्टेड और/या स्वयं-संदर्भ प्रश्नों की संभावना है?उपनाम तालिका नामों के साथ ActiveRecord क्वेरी
scope :current, ->(as_at = Time.now) { current_and_expired(as_at).current_and_future(as_at) }
scope :current_and_future, ->(as_at = Time.now) { where("#{upper_bound_column} IS NULL OR #{upper_bound_column} >= ?", as_at) }
scope :current_and_expired, ->(as_at = Time.now) { where("#{lower_bound_column} IS NULL OR #{lower_bound_column} <= ?", as_at) }
def self.lower_bound_column
lower_bound_field
end
def self.upper_bound_column
upper_bound_field
end
और has_many के माध्यम से जाना जाता है, उदाहरण के: has_many :company_users, -> { current }
तो एक ActiveRecord क्वेरी जो कुछ मॉडलों के लिए संदर्भित करता जाता है
मेरी चिंताओं में से एक में, मैं इन के समान स्कोप जिसमें चिंता शामिल है, इसका परिणाम 'संदिग्ध कॉलम नाम' अपवाद में होता है जो समझ में आता है।
मदद करने के लिए इस पर काबू पाने, मैं, स्तंभ नाम सहायक विधियों में परिवर्तन अब
def self.lower_bound_column
"#{self.table_name}.#{lower_bound_field}"
end
def self.upper_bound_column
"#{self.table_name}.#{upper_bound_field}"
end
कौन सा अच्छा काम करता है होना करने के लिए जब तक आप स्वयं को संदर्भित प्रश्नों की आवश्यकता है। अरेल जिसके परिणामस्वरूप एसक्यूएल में तालिका नाम अलियासिंग से इन मुद्दों को कम, उदाहरण के लिए मदद करता है:
LEFT OUTER JOIN "company_users" "company_users_companies" ON "company_users_companies"."company_id" = "companies"."id"
और
INNER JOIN "company_users" ON "users"."id" = "company_users"."user_id" WHERE "company_users"."company_id" = $2
यहां मुद्दा यह है कि self.table_name
अब तालिका नाम का उल्लेख है प्रश्न में और यह गाल संकेत में जीभ में परिणाम: HINT: Perhaps you meant to reference the table alias "company_users_companies"
अरेल के लिए खत्म हो इन प्रश्नों विस्थापित करने की कोशिश में, मैं करने के लिए स्तंभ नाम सहायक तरीकों को बदल दिया:
def self.lower_bound_column
self.class.arel_table[lower_bound_field.to_sym]
end
def self.upper_bound_column
self.class.arel_table[upper_bound_field.to_sym]
end
और स्कोप अद्यतन प्रतिबिंबित करने के लिए:
lower_bound_column.eq(nil).or(lower_bound_column.lteq(as_at))
लेकिन यह सिर्फ भर के बाद से self.class.arel_table
हमेशा क्वेरी की परवाह किए बिना ही होगा मुद्दा स्थलांतरित किया।
मुझे लगता है कि मेरे सवाल है, है कि कैसे मैं दायरे होते स्वयं को संदर्भित प्रश्नों में इस्तेमाल किया जा सकता है, जो इस तरह के <=
और >=
के रूप में ऑपरेटरों की आवश्यकता होती है बना सकता हूँ?
संपादित करता
मैं मदद करने के लिए इस मुद्दे का प्रदर्शन एक बुनियादी आवेदन बनाया है।
git clone [email protected]:fattymiller/expirable_test.git
cd expirable_test
createdb expirable_test-development
bundle install
rake db:migrate
rake db:seed
rails s
निष्कर्ष और मान्यताओं sqlite3 में
- काम करता है, नहीं Postgres। सबसे अधिक संभावना है क्योंकि पोस्टग्रेस एसक्यूएल में प्रश्नों के क्रम को लागू करता है?
मुझे एक ही समस्या है। मेरा प्रश्न यहां देखें: http://stackoverflow.com/questions/28595636/rails-4-how-to-give-alias-names-to-includes-and-joins-in-active-record-que – phlegx