एक तालिका तालिका संपत्ति के माध्यम से sort_many छंटनी है

मान लें कि मेरे पास rails4 ऐप में निम्न है:

class Foo < AR::Base
  has_many :foo_bar
  has_many :bar, through: :foo_bar
end

और foo_bar तालिका में एक संख्या के साथ "सॉर्ट" कॉलम है। मामलों को और भी मनोरंजक बनाने के लिए, "बार" तालिका ALSO में एक संख्या के साथ "सॉर्ट" कॉलम होता है। जॉइन टेबल सॉर्ट कॉलम के समान नाम। और, यह महत्वपूर्ण है ...

class Bar < AR::Base
  default_scope -> { order(:sort) }
end

मुझे एसोसिएशन पर एक डिफ़ॉल्ट दायरा होना चाहिए, जैसे कि:

foo = Foo.last
foo.bars # => List of bars, ordered by the number on the foo_bar table

मैं यह कैसे कर सकता हूँ? इसका मतलब है बार को अपनाना, लेकिन बस तरह

0

3 उत्तर

मुझे यह करने से काम करने के लिए मिला:

class Foo < AR::Base
  has_many :foo_bar
  has_many :bar, through: :foo_bar

  def sorted_bars
    foo_bar.map(&:bar)
  end
end

डिफ़ॉल्ट क्षेत्रों के कारण, यह मेरे लिए बहुत जटिल था। मैं अभी भी एक उत्तर स्वीकार करूंगा जो एक और अधिक सुरुचिपूर्ण समाधान प्रदान करता है :)

0
जोड़ा

आप ऑर्डर विकल्प का उपयोग करके संग्रह के लिए सॉर्ट ऑर्डर निर्दिष्ट कर सकते हैं

class Foo < AR::Base
  has_many :foo_bar
  has_many :bar, -> { order('foo_bar.sort') }, through: :foo_bar
end
0
जोड़ा
धन्यवाद। मुझे एक और समस्या मिली: बार पर एक डिफ़ॉल्ट दायरा। कोई विचार?
जोड़ा लेखक Trevoke, स्रोत
दुर्भाग्य से यह काम नहीं किया।
जोड़ा लेखक Trevoke, स्रोत
मेरा मानना ​​है कि रेल कोड में unscope विधि के साथ एक बग है 4.0.एक्स (मेरे परीक्षणों को देखें - gist.github.com/railscard/4ab5d5996bd867c08ec0 )। मुझे लगता है कि आपका वर्तमान समाधान पूरी तरह से ठीक है, लेकिन 4.1.0 को अपडेट करने के बाद ऑर्डरिंग को दोबारा भूलना न भूलें
जोड़ा लेखक railscard, स्रोत

तुम यह कर सकते थे:

foo.bars.sort(foo_bar.position)

sort will sort the list by a given attribute, so give it the attribute on foo_bar that you wish to sort by.

0
जोड़ा
आह, हाँ, अच्छा बिंदु। मैं अपने प्रश्न में कुछ महत्वपूर्ण कहना भूल गया। मैं इसे अभी संपादित कर दूंगा, लेकिन यहां यह है: मुझे इसे एसोसिएशन पर डिफ़ॉल्ट दायरा होने की आवश्यकता है।
जोड़ा लेखक Trevoke, स्रोत
मैंने सवाल संपादित किया। मेरे पास एक डिफ़ॉल्ट स्कोप समस्या है।
जोड़ा लेखक Trevoke, स्रोत